链表基本操作的c语言编程实现,链表及其基本操作的实现(C语言)

基于严蔚敏版的《数据结构(C语言版)》实现单链表及其基本操作。

1、头文件和结构体:

#include #include#includetypedefintElemType;

typedefstructLNode{

ElemType data;struct LNode *next;

}LNode,*LinkList;

2、函数声明:

int createList(LinkList *L, intn);int getElem(LinkList L, inti);intprint_List(LinkList head);int listInsert(LinkList L, inti, ElemType e);int listDelete(LinkList L, inti);

LinkList mergeList(LinkList La, LinkList Lb);

需要注意的是,如果主函数main在其他函数之后就不需要函数声明,编译时也不会有警告;反之,需要声明函数,否则会出现编译警告。我这里把主函数放在最后面。

3、创建一个带头结点的单链表

int createList(LinkList *L, int n){//创建一个带头结点的链表

LinkList newLNode, head, temp;inti;

ElemType data;

head= (LinkList) malloc (sizeof(LNode));

temp=head;for(i=0; i

newLNode= (LinkList) malloc (sizeof(LNode));//生成新节点

printf("输入第%d个元素的值:",i+1);

scanf("%d", &data);

newLNode->data =data;

temp->next =newLNode;

temp=newLNode;

}

newLNode->next =NULL;*L =head;return 0;

}//createList

4、打印单链表

int print_List(LinkList head) {//打印

printf("当前链表:");

LinkList temp;if(head == NULL || head->next ==NULL) {

printf("空表n");

}

temp=head;while(temp->next) {

printf("%d", temp->next->data);

temp= temp->next;

}

printf("n");

printf("n");

printf("n");return 0;

}

5、按位获取单链表的元素

int getElem(LinkList L, int i){//按位获取,返回第i个元素的值

LinkList temp;

temp=L;for(int j = 1; j<=i; j++){

temp= temp->next;

}return temp->data;

}

6、按位插入元素

int listInsert(LinkList L, int i, ElemType e){//按位插入元素

LinkList p =L;int j = 0;while(p && j

p= p->next;++j;

}if(!p || j>i-1) return -1;

LinkList s= (LinkList) malloc (sizeof(LNode));

s->data =e;

s->next = p->next;

p->next =s;return 0;

}

7、按位删除,返回被删除的元素

int listDelete(LinkList L, int i){//按位删除,返回被删除的元素的值

LinkList p, q;

p=L;int j = 0;while(p->next && j

p= p->next;++j;

}if(!(p->next) || j>i-1) return -1;

q= p->next;

p->next = q->next;

ElemType e= q->data;free(q);returne;

}

8、非递减的线性表合并,前提是输入的两个单链表是非递减的(因为这里没实现单链表排序)。

LinkList mergeList(LinkList La, LinkList Lb) {//非递减表合并

LinkList pa, pb, pc;

pa= La->next;

pb= Lb->next;

LNode newNode;

LinkList Lc;//新链表的头结点

Lc = &newNode;

pc= Lc;//新链表的当前结点

pc->next =NULL;while(pa &&pb) {if(pa->data <= pb->data) {

pc->next =pa;

pc=pa;

pa= pa->next;

}else{

pc->next =pb;

pc=pb;

pb= pb->next;

}

}

pc->next = pa ?pa : pb;free(Lb);

print_List(Lc);returnLc;

}

9、主函数

intmain(){

printf("创建链表,请输入链表长度:");intlength;

scanf("%d", &length);

LinkList L;

createList(&L, length);

print_List(L);

printf("需要获取第几个元素?");intelemIndex;

scanf("%d", &elemIndex);int get_e =getElem(L, elemIndex);

printf("第%d个元素的值为 %dn", elemIndex, get_e);

print_List(L);

printf("插入的位置:");intinserIndex;

scanf("%d", &inserIndex);

printf("插入的数据:");intinserData;

scanf("%d", &inserData);

listInsert(L, inserIndex, inserData);

print_List(L);

printf("删除第几个元素?");intdeleIndex;

scanf("%d", &deleIndex);

ElemType dele_e=listDelete(L, deleIndex);

printf("已删除元素:%dn", dele_e);

print_List(L);

printf("--------非递减链表的合并--------nnn");

LinkList La, Lb;int len1=4,len2=3;

printf("输入第一个非递减链表(长度为4):n");

createList(&La, len1);

print_List(La);

printf("输入第二个非递减链表(长度为3):n");

createList(&Lb, len2);

print_List(Lb);

printf("合并后的链表:");

mergeList(La, Lb);

system("pause");return 0;

}

最后,运行结果:

888208c08179526f339cd8d7e65b89a5.png

——————完——————

内容来源于网络如有侵权请私信删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值