基于严蔚敏版的《数据结构(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;
}
最后,运行结果:
——————完——————
内容来源于网络如有侵权请私信删除