#include<stdio.h> #include<stdlib.h> typedef int datatype; //存储结构定义 typedef struct LNODE { datatype data; struct LNODE *next; }Lnode, *LinkList; //打印链表 void printlist(const LinkList l) { LinkList p=l->next; while(p) { printf("%d ",p->data); p=p->next; } printf(" "); return; } //链表初始化 LinkList initlist() { LinkList l; l=(LinkList)malloc(sizeof(Lnode)); if(l==NULL) { printf("l failed! "); return NULL; } l->next=NULL; return l; } //创建链表 LinkList createlist(LinkList l) { l=initlist(); int x; LinkList s,r=l; printf("please input the data: "); scanf("%d",&x); while(x!=0) { s=(LinkList)malloc(sizeof(Lnode)); s->data=x; if(l->next==NULL) l->next=s; else r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return l; } //求链表的长度 int lengthlinklist(const LinkList l) { int i=0; LinkList p=l; while(p->next) { ++i; p=p->next; } return i; } //查找第i个元素 LinkList searchlinklist(const LinkList l,int i) { int j=0; LinkList p=l; if(lengthlinklist(l)<i) { printf("i is error! "); return NULL; } while(p->next&&j<i) { ++j; p=p->next; } if(j==i) return p; else return NULL; } //查找值为x的元素 LinkList searchlinklist1(LinkList l, datatype x) { LinkList p=l->next; while(p&&p->data!=x) p=p->next; if(p->data==x) return p; else return NULL; } //在链表的第i个位置插入值为x的节点 int insertlinklist(LinkList l,int i, datatype x) { LinkList p,s=searchlinklist(l,i-1); if(!p) { printf("error! "); return 0; } else { p=(LinkList)malloc(sizeof(Lnode)); p->data=x; p->next=s->next; s->next=p; return 1; } } //删除第i个元素 int deletelinklist(LinkList l, int i) { LinkList p; LinkList q=searchlinklist(l,i-1); if(!p) { printf("error! "); return -1; } else if(!p->next) { printf("i not exist! "); return 0; } else { p=q->next; q->next=p->next; free(p); return 1; } } //合并两个链表 LinkList guibinglinklist(const LinkList a,const LinkList b,LinkList c) { LinkList h1,h2,h; h1=a->next; h2=b->next; c=a; h=c; while(h1&&h2) { if(h1->data<=h2->data) { h->next=h1; h=h1; h1=h1->next; } else { h->next=h2; h=h2; h2=h2->next; } } if(h1) h->next=h1; if(h2) h->next=h2; printlist(h); return c; } //链表转置 LinkList zhuanzhilinklist(LinkList l) { LinkList p,q,r; p=l->next; q=NULL; while(p) { r=p->next; p->next=q; q=p; p=r; } l->next=q; return l; } //排序 LinkList sortlist(LinkList l) { if(!l->next||!l->next->next) return; LinkList p,h,t; p=l->next->next; l->next->next=NULL; while(p) { h=p->next; t=l; while(t->next&&p->data>t->next->data) t=t->next; p->next=t->next; t->next=p; p=h; } return l; } //删除链表中重复的元素 LinkList shanchongfu(LinkList l) { LinkList p,q,r; p=l->next; if(!p) return NULL; while(p) { q=p; while(q->next) { if(q->next->data==p->data) { r=q->next; q->next=r->next; free(r); } else q=q->next; } p=p->next; } return l; } int main() { LinkList a,b,c; // LinkList p; //打印 LinkList s; int len; a=createlist(a); printlist(a); len=lengthlinklist(a); printf("length =%d ",len); s=searchlinklist(a,3); printf("the third is:%d ",s->data); if(searchlinklist(a,4)) printf("exit! "); else printf("not exit! "); if(insertlinklist(a,3,8)==1) { printf("insert success! "); } else printf("insert failed! "); if(deletelinklist(a,4)==1) { printf("delete success! "); } b=createlist(b); printlist(b); c=guibinglinklist(a,b,c); if(c) printf("guibing chenggong! "); printlist(c); c=zhuanzhilinklist(c); printlist(c); c=sortlist(c); printlist(c); c=shanchongfu(c); printlist(c); return 0; }