代码如下:
#include//此链表设有头结点 #include #include #define ERROR 0 #define OK 1 #define OVERFLOW -2 typedef int Elemtype; typedef int Status ; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Linklist; //函数声明应放在定义结构体之后 LNode * Creat(int n); Status Insert(Linklist L,int i,Elemtype e); Status Del(Linklist L,int i,Elemtype *e); Status Find(Linklist L,int i,Elemtype *e); void display(Linklist L); LNode * Creat(int n) { LNode *p,*q,*L; int i; p=(Linklist)malloc(sizeof(LNode)); if(!p) { return ERROR; exit(OVERFLOW); } p->data=0;//头结点存放的值 for(i=1;i<=n;i++) { if(i==1)L=p; else q->next=p; q=p; p=(Linklist)malloc(sizeof(LNode)); scanf("%d",&p->data); } q->next=p; q=p; q->next=NULL; return L; } Status Insert(Linklist L,int i,Elemtype e) { int j=0; LNode *p,*q; p=L; while(p&&j next; j++; } if(!p||j>i-1) { printf("插入失败!\n\n"); return ERROR; } q=(Linklist)malloc(sizeof(LNode)); q->data=e; q->next=p->next; p->next=q; return OK; } Status Del(Linklist L,int i,Elemtype *e) { LNode *p,*q; int j=0; p=L; while(p->next&&j next; j++; } if(!p->next||j>i-1) { printf("删除失败!\n"); return ERROR; } else { q=p->next; p->next=q->next; *e=q->data; free(q); return OK; } } Status Find(Linklist L,int i,Elemtype *e) { LNode *p; int j=0; p=L; while(p&&j next; j++; } if(!p||j>i) { printf("查找失败!\n"); return ERROR; } else *e=p->data; return OK; } void display(Linklist L) { LNode *p; p=L->next; while(p) { printf("%d ",p->data); p=p->next; } putchar('\n'); } int main() { LNode *p; int n,i,t=1; Elemtype e; char c; printf("请输入你要输入的元素的个数:\n"); scanf("%d",&n); printf("请分别输入各个元素:"); p=Creat(n); while(t) { printf("1)插入元素\n2)删除元素\n3)查找某个元素\n4)显示所有元素\n0)退出\n"); getchar(); c=getchar(); switch(c) { case '1':printf("请输入你要插入的元素的位置:\n"); scanf("%d",&i);printf("请输入插入的元素:\n"); scanf("%d",&e); Insert(p,i,e); t=1; break; case '2':printf("请输入你要删除的元素的位置:\n"); scanf("%d",&i); if(Del(p,i,&e)==OK) printf("删除的元素为:%d\n",e); t=1; break; case '3':printf("请输入你要查找的元素的位置:\n"); scanf("%d",&i); if(Find(p,i,&e)==OK) printf("查找的元素为:%d\n",e); t=1; break; case '4':display(p);t=1;break; case '0':t=0;break; } if(t) { printf("请按任意键继续……\n"); getch(); system("cls"); } } return 0; }
总结:
1)链表最好带上头结点,容易操作;
2)用返回的状态来控制输出
3)传地址的操作,若函数的改变,则原来的也变,但是我试了一下,创建函数,只能返回头指针,才能用display()函数输出;
4)Del()函数中,需用中间变量q代替p->next,不能直接p,而free(p->next),会出错的,试过了。
5)Del()和Find()函数中,注意是怎样传入,和输出的。