链表的操作(增删改查)及逆置链表

链表的操作(增删 改查)及逆置链表 (c 语言实现 可直 接复制粘贴)
#include <stdio.h> #include <stdlib.h> #define null 0 typedef struct node { int data; struct node * next; }ElemSN; ElemSN*CreateLink(int a[],int n); void PrintLink (ElemSN* h); void PreprintLink (ElemSN* h); ElemSN* DelLink(ElemSN* h,int x); ElemSN* DelmaxLink(ElemSN* h); ElemSN* NiLink(ElemSN* h); ElemSN* AddLink(ElemSN* h,int x); void SearchLink(ElemSN* h,int x); void GaiLink(ElemSN* h,int x); ElemSN* ChangeNode(ElemSN* h); ElemSN*CreateLink(int a[],int n) { ElemSN*h,*p,*t; int i; for (i=0;i<n;i++)

{ p=(ElemSN*)malloc(sizeof(ElemSN)); p->data=a[i];p->next=null; if(!i)h=t=p; else t=t->next=p; } return h; } void PrintLink (ElemSN* h) { ElemSN*p; for (p=h;p;p=p->next) printf("%5d",p->data); printf("\n"); } void PreprintLink (ElemSN* h) { ElemSN*end,*p; end=null; while(end!=h) { for(p=h;p->next!=end;p=p->next); printf("%5d",p->data); end=p; }printf("\n"); } ElemSN* DelLink(ElemSN* h,int x) { ElemSN*q,*p; p=h; while(p) { if(p->data-x) { q=p; p=p->next; } else { if(p-h) { q->next=p->next; free(p); p=q->next; }

else { h=h->next; free(p); p=h; } } } return h; } ElemSN* DelmaxLink(ElemSN* h) { ElemSN*p,*q,*x; for(q=null,x=p=h;p->next;p=p->next) { if(x->data<p->next->data) { x=p->next; q=p; } } if(!q) h=h->next; else q->next=x->next; free(x); return h; } ElemSN* NiLink(ElemSN* h) { ElemSN*p,*t; for(t=h;t->next;t=t->next); p=h->next; while(h-t) { h->next=t->next; t->next=h; h=p; p=p->next; } return h; } ElemSN* AddLink(ElemSN* h,int x) { ElemSN* p;

p=(ElemSN*)malloc(sizeof(ElemSN)); p->data =x;p->next =h; h=p; return h; } void SearchLink(ElemSN* h,int x) { ElemSN* p; for(p=h;p&&p->data!=x;p=p->next); if(p)printf("找到了! ! !是%d 吗?\n",p->data); else { printf("唉。 。 。没找到啊\n"); PrintLink(h); } } void GaiLink(ElemSN* h,int x) { int i; ElemSN* p; for(p=h;p&&p->data!=x;p=p->next); if(!p) { printf("唉。 。 。没有让我咋改啊\n"); PrintLink(h); } else { printf("找到了! ! !要改%d 吗?\n",p->data); printf("输入要改成的值吧:\n"); scanf("%d",&i); p->data=i; printf("修改成功! ! !请看:\n"); PrintLink(h); printf("\n"); } } ElemSN* ChangeNode(ElemSN* h) { ElemSN*max1,*max2,*p,*q1,*q2; max1=p=h;max2=h->next; q1=q2=null;

while(p->next) { if(p->next->data>max1->data) { q2=q1; max2=max1; max1=p->next; q1=p; } else if(p->next->data>max2->data) { max2=p->next; q2=p; } p=p->next; } printf("最大%d,次大%d\n",max1->data,max2->data); if(!q1) { h=h->next; q2->next=max2->next; max2->next=h;h=max2; max1->next=q2->next; q2->next=max1; } else { if(!q2) { h=h->next; q1->next=max1->next; max1->next=h;h=max1; max2->next=q1->next; q1->next=max2; } else { q1->next=max1->next; q2->next=max2->next; max2->next=q1->next; q1->next=max2; max1->next=q2->next; q2->next=max1; }

} return h; } int main (void) { int a[7]={5,10,31,32,4,9,1}; int x; ElemSN* head; head=CreateLink(a,7); PrintLink(head); head=ChangeNode(head); PrintLink(head); //输出 /*PreprintLink(head); //逆向输出 printf("要添的是(添在头):"); scanf("%d",&x); head=AddLink(head,x); PrintLink(head); //增 printf("要删的是:"); scanf("%d",&x); head=DelLink(head,x); PrintLink(head); //删 printf("删除最大值"); head=DelmaxLink(head); PrintLink(head); //删最大值 printf("要改的是(不能改重复值哦 >O<):"); scanf("%d",&x); GaiLink(head,x); //改 printf("要找的是:"); scanf("%d",&x); SearchLink(head,x); //查 printf("逆置\n"); head=NiLink(head); PrintLink(head); //逆置*/ }


相关文档

链表的增删改查
链表的创建、删除、逆置、查找及排序
链表的增删改操作
c++课程设计《链表的实现-增删改查》
双链表增删改查
C语言指针链表(增、删、改、查)
链表的相关操作(建立、插入、删除、查找、逆置)
链表的创建,查找,删除和插入操作(详解)
有向图的十字链表表示及相关操作(包括增删弧删顶点等)
实现链表的常用操作(包括:创建、插入、删除以及查询)
电脑版