链表操作集完整代码【C语言】详解版
结果

代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Link {
ElementType elem;
struct Link *next;
} link;
link * InitLink_H();
link * Insert(link *p, ElementType elem, int pos);
link * Delete(link *p, int pos);
int FindElem(link *p, ElementType elem);
ElementType FindKth(int pos, link *p);
link * Amend(link *p, int pos, ElementType newElem);
void ShowLinkList_H(link *p);
link * ClearLinkList(link *p);
int Length(link *p);
int main() {
ElementType X,newElem;
link *p = NULL;
int pos,i,choice = 99;
printf("******链表操作主菜单******\n");
printf("*\t1.创建\t\t*\n*\t2.插入\t\t*\n*\t3.删除\t\t*\n*\t4.查找\t\t*\n*\t5.修改\t\t*\n*\t6.输出\t\t*\n*\t7.清空\t\t*\n*\t8.求表长\t*\n*\t9.按序号查找\t*\n*\t0.退出\t\t*\n************************\n");
while (choice != 0) {
printf("\t请输入你的选择(数字):");
scanf("%d",&choice);
fflush(stdin);
switch (choice) {
case 0:
printf("\n安全退出程序...");
exit(0);
case 1:
p = InitLink_H();
break;
case 2:
printf("\n请输入要插入的元素X和要插入的位置pos:");
scanf("%d %d",&X,&pos);
fflush(stdin);
p = Insert(p, X, pos);
break;
case 3:
printf("\n请输入要删除的位置pos:");
scanf("%d", &pos);
fflush(stdin);
p = Delete(p, pos);
break;
case 4:
printf("\n请输入要查找的元素X:");
scanf("%d", &X);
fflush(stdin);
i = FindElem(p, X);
if ( i == -1 ) printf("查找错误: %d 不是此线性表中元素.\n", X);
else printf("%d 在 %d 处 .\n", X, i);
break;
case 5:
printf("\n请输入要修改的位置和新元素:");
scanf("%d %d",&pos, &newElem);
fflush(stdin);
p = Amend(p, pos, newElem);
break;
case 6:
ShowLinkList_H(p);
break;
case 7:
p = ClearLinkList(p);
break;
case 8:
printf(" 表长为%d",Length(p));
break;
case 9:
printf("\n请输入要查找的位置:");
scanf("%d",&pos);
fflush(stdin);
printf("\n第%d个位置上的元素为:%d",pos, FindKth(pos,p));
break;
default:
printf("无效选择,请确认菜单有此选项再重新输入!");
break;
}
}
return 0;
}
link * InitLink_H() {
link * p = (link*)malloc(sizeof(link));
link * temp = p;
int i = 0;
ElementType e;
printf("\n输入链表元素(以-999结束输入):");
while (1) {
link *a = (link*)malloc(sizeof(link));
if (!a) {
printf("...空间分配失败!");
exit(0);
}
scanf("%d",&e);
if(e == -999) break;
a->elem = e;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
link * Insert(link * p, ElementType elem, int pos) {
link * temp = p;
link * c = NULL;
int i = 0;
for (i = 1; i < pos; i++) {
if (temp == NULL) {
printf("插入位置无效\n");
return p;
}
temp = temp->next;
}
c = (link*)malloc(sizeof(link));
c->elem = elem;
c->next = temp->next;
temp->next = c;
return p;
}
link * Delete(link * p, int pos) {
link * temp = p;
link * del = NULL;
int i = 0;
for (i = 1; i < pos; i++) {
temp = temp->next;
}
del = temp->next;
temp->next = temp->next->next;
free(del);
return p;
}
int FindElem(link * p, ElementType elem) {
link * t = p;
int i = 1;
while (t->next) {
t = t->next;
if (t->elem == elem) {
return i;
}
i++;
}
return -1;
}
ElementType FindKth (int pos, link *p) {
link *t = p;
int i = 0;
while (t != NULL && i < pos) {
t = t->next;
i++;
}
if (i == pos) return t->elem;
else {
printf("\t位置参数pos错误...");
return NULL;
}
}
link * Amend(link * p, int pos, ElementType newElem) {
int i = 0;
link * temp = p;
temp = temp->next;
for (i = 1; i < pos; i++) {
temp = temp->next;
}
temp->elem = newElem;
return p;
}
void ShowLinkList_H(link *p) {
link* temp = p;
printf("\n链表为:");
while (temp->next) {
temp = temp->next;
printf("%d ", temp->elem);
}
printf("\n");
return;
}
link * ClearLinkList(link *p) {
link *a,*b;
a=p->next;
while(a) {
b=a->next;
free(a);
a=b;
}
p->next=NULL;
printf("\n...整个链表已清空...");
return p;
}
int Length(link *p) {
int len=0;
link *a=p->next;
while(a) {
len++;
a=a->next;
}
return len;
}