链表的基础操作(插入元素、删除元素、查找元素、输出元素)
一、编写链表基本操作的函数:
(1)InitList(LIST *L,int ms): 初始化链表。
(2)InsertListl(LIST *L,int item,int rc):向链表指定位置插入元素。
(3)InsertList2(LIST *L,int item,int rc):向有序链表指定位置插入元素。
(4)DeleteList(LIST *L,int item):删除指定元素值的链表记录。
(5)FindList(LIST *L,int item):查找链表中的元素。
(6)OutputList(LIST *L):输出链表元素。
二、具体步骤:
(1)初始化链表;
(2)调用插人函数建立一个链表;
(3)在链表中寻找指定的元素;
(4)在链表中删除指定值的元素;
(5)遍历并输出链表。
三、代码演示:
1、栈的源代码:
bash
#include<stdio.h>
#define MAXN 10 /* 栈的最大容量 */
/* 定义栈的类型为int */
int push( int *stack, int maxn, int *toppt, int x ) /* 进栈函数 */
{
if( *toppt >= maxn ) /* 栈满,进栈失败,返回1 */
return 1;
stack[*toppt] = x; /* 元素进栈 */
++(*toppt); /* 栈顶指针+1 */
return 0; /* 进栈成功 */
}
int pop( int *stack, int *toppt, int *cp ) /*出栈函数*/
{
if(*toppt == 0) /* 栈空,出栈失败,返回1 */
return 1;
--(*toppt); /* 栈顶指针−1 */
*cp = stack[*toppt];
return 0; /* 出栈成功 */
}
void OutputStack( int *stack, int toppt ) /* 输出栈元素 */
{
int i;
for( i = toppt - 1; i >= 0; i-- )
printf( "%d", stack[i] );
printf( "\n" );
}
void main()
{
int s[MAXN], i; /* 定义栈 */
int top = 0; /* 设置为空栈 */
int op;
while( 1 )
{
printf( "请选择操作,1:进栈 2:出栈 0:退出 " );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &op );
switch( op ) {
case 0: /* 退出 */
return;
case 1: /* 进栈 */
printf( "请输入进栈元素:" );
scanf( "%d", &i );
if(push( s, MAXN, &top, i ) == 0) { /* 进栈成功 */
printf( "进栈成功,栈内元素为:\n" );
OutputStack( s, top );
}
else
printf( "栈满\n" );
break;
case 2: /* 出栈 */
if(pop( s, &top, &i ) == 0) { /* 出栈成功 */
printf( "出栈元素为: [%d] , 栈内元素为:\n" , i );
OutputStack( s, top );
}
else
printf( "栈空\n" );
break;
}
}
}
2、队列的源代码:
bash
#include<stdio.h>
#include<malloc.h>
typedef struct queue { /* 定义队列结构 */
int data; /* 队列元素类型为int */
struct queue *link;
}QUEUE;
void EnQueue( QUEUE **head, QUEUE **tail, int x ) /* 进队操作 */
{
QUEUE *p;
p = (QUEUE *)malloc( sizeof(QUEUE) );
p->data = x;
p->link = NULL; /* 队尾指向空 */
if( *head == NULL ) /* 队首为空,即为空队列 */
*tail = NULL;
else {
(*tail)->link = p; /* 新单元进队列尾 */
*tail = p; /* 队尾指向新入队单元 */
}
}
int DeQueue( QUEUE **head, QUEUE **tail, int *cp ) /* 出队操作 1:队空 */
{
QUEUE *p;
p = *head;
if( *head == NULL ) /* 队空 */
return 1;
*cp = (*head)->data;
*head = (*head)->link;
if( *head == NULL ) /* 队首为空,队尾也为空 */
*tail = NULL;
free( p ); /* 释放单元 */
return 0;
}
void OutputQueue( QUEUE *head ) /* 输出队列中元素 */
{
while (head != NULL) {
printf( "%d", head->data );
head = head->link;
}
printf( "\n" );
}
int main()
{
QUEUE *head, *tail;
int op, i;
head = tail = NULL; /* 将队列头和尾置为空 */
while( 1 )
{ printf( "请选择操作,1:进队 2:出队 0:退出 " );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &op );
switch( op ) {
case 0: /* 退出 */
return 0;
case 1: /* 进队 */
printf( "请输入进队元素:" );
scanf( "%d", &i );
EnQueue( &head, &tail, i );
printf( "队内元素为:\n" );
OutputQueue( head );
break;
case 2: /* 出队 */
if( DeQueue( &head, &tail, &i ) == 0 ) { /* 出队成功 */
printf( "出队元素为: [%d] , 队内元素为:\n" , i );
OutputQueue( head );
}
else
printf( "队空\n" );
break;
}
}
}
四、运行结果:
1、栈:
2、队列:
五、总结:
线性表链式存储结构,它不需要用地址连续的存储单元来实现,因为它不要求逻辑上相邻的两个数据元素在物理上也相邻,它是通过"链"建立起数据元素之间的逻辑关系的,因此对线性表的插入、删除不需要移动数据元素。