#include<stdio.h> #include<stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //单链表的建立1,头插法建立单链表,逆序生成 LinkList LinkListCreateH() { LinkList L,p; L = (LinkList)malloc(sizeof(LNode)); L->data = -1; L->next = NULL; ElemType x; while(scanf("%d",&x)!=EOF) { p = (LinkList)malloc(sizeof(LNode)); p->data = x; p->next = L->next; L->next = p; } return L; } //单链表的建立2,尾插法建立单链表 LinkList LinkListCreateT() { LinkList L,p,q; L = (LinkList)malloc(sizeof(LNode)); L->data = -1; L->next = NULL; q=L; ElemType x; while(scanf("%d",&x)!=EOF) { p = (LinkList)malloc(sizeof(LNode)); p->data = x; q->next = p; q=p; } q->next = NULL; return L; } //单链表的插入,在链表的第i个位置插入x的元素 LinkList LinkListInsert(LinkList L,int i,ElemType x) { LinkList p,q; p = L; for(int temp=0;temp<i;++temp) p = p->next; q = (LinkList)malloc(sizeof(LNode)); q->data = x; q->next = p->next; p->next = q; return L; } //单链表的删除,在链表中删除值为x的元素 LinkList LinkListDelete(LinkList L,ElemType x) { LinkList p,q; p=q = L;//不能为L->next,不然当删除第一个元素时会出错 while(p->next->data!=x) p = p->next; if(p->next) { q=p->next; p->next=q->next; free(q); } return L; } //单链表逆置 LinkList LinkListReverse(LinkList L) { printf("逆置开始"); LinkList p,q; p=q=L->next; L->next = NULL; while(p) { q=p->next; p->next = L->next; L->next = p; p=q; } return L; } //单链表排序 LinkList LinkListSort(LinkList L) { printf("排序开始!"); LinkList p,q; int temp; for (p=L->next;p!=NULL;p=p->next) { for (q=p->next;q!=NULL;q=q->next) { if(q->data<p->data) { temp=q->data; q->data = p->data; p->data = temp; } } } return L; } //主函数 int main() { LinkList list,start; printf("输入单链表的数据:\n"); list = LinkListCreateT(); for(start = list->next;start!=NULL;start=start->next) printf("%3d",start->data); printf("创建成功,请输入插入的元素位置及数据:\n"); int x,y; scanf("%d,%d",&x,&y); LinkListInsert(list,x,y); for(start = list->next;start!=NULL;start=start->next) printf("%3d",start->data); printf("插入成功,请输入删除的元素:\n"); int z; scanf("%d",&z); LinkListDelete(list,z); for(start = list->next;start!=NULL;start=start->next) printf("%3d",start->data); printf("将单链表进行逆置吗?"); int flag; scanf("%d",&flag); if(flag==1) LinkListReverse(list); else printf("不逆置!"); for(start = list->next;start!=NULL;start=start->next) printf("%3d",start->data); printf("将单链表进行排序吗?"); int flag1; scanf("%d",&flag1); if(flag1==1) LinkListSort(list); else printf("不排序!"); for(start = list->next;start!=NULL;start=start->next) printf("%3d",start->data); return 0; }
时间: 2024-10-13 10:23:18