这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能。。但是最近要考试了,所以没有写成菜单的形式。。等考试完了,在进行补充吧。。
代码如下。。。
#include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,pos,t,number; int i,j,temp; struct node *head,*p,*tail,*last,*current; struct node *p1,*p2; printf("input numbers end of 0:\n"); head=NULL; scanf("%d",&n); p=(struct node *)malloc(sizeof(struct node)); p->data=n; p->next=head; head=p; tail=p; scanf("%d",&n); number=1; while(n) { number++; p=(struct node *)malloc(sizeof(struct node)); p->data=n; p->next=NULL; tail->next=p; tail=p; scanf("%d",&n); } p=head; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); /*建立链表操作*/ /*链表的排序操作*/ /*选择排序法*/ for(p1=head,i=0;i<number-1;i++,p1=p1->next) for(p2=p1->next,j=i+1;j<number;j++,p2=p2->next) { if(p1->data>p2->data) { temp=p1->data; p1->data=p2->data; p2->data=temp; } } /*冒泡排序*/ printf("排序后的链表\n"); p=head; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); for(i=0;i<number-1;i++) for(p1=head,p2=p1->next,j=0;j<number-i-1;j++,p1=p2,p2=p2->next) { if(p1->data>p2->data) { temp=p1->data; p1->data=p2->data; p2->data=temp; } } printf("排序后的链表\n"); p=head; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); /*对于删除操作要用到两个指针,一个是遍历指针,一个是last指针。*/ /*链表的插入操作*/ /*实行删除操作*/ printf("请输入命令:1代表执行 0表退出\n"); scanf("%d",&pos); while(pos) { printf("请输入您想删除的数字\n"); scanf("%d",&x); p=head; while(p->data!=x&&p->next!=NULL) { last=p; p=p->next; } if(head->data==x)//要删除的元素在头部 head=p->next; else if(p->data==x)//要删除的元素在中间或则尾部 last->next=p->next; else//错误的输入 printf("fuck 错误输入\n"); p=head; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); printf("请输入命令:1代表执行 0代表退出\n"); scanf("%d",&pos); } /*实行删除操作*/ /*插入操作要用到3个指针,一个current指针,一个last指针,还有一个是插入的那一个*/ printf("将执行插入操作\n"); printf("请输入命令:1代表执行 0代表退出\n"); scanf("%d",&pos); while(pos) { printf("请输入您想插入的数\n"); scanf("%d",&t); p=(struct node *)malloc(sizeof(struct node)); p->data=t; current=head; while(current->data<t&¤t->next!=NULL) { last=current; current=current->next; }//查找t在有序数列中的位置 if(t<head->data)//如果插入的数字在头部 { p->next=head; head=p; } else if(current->next==NULL)//如果插入的数在尾部 { p->next=NULL; current->next=p; } else//插入的数在中间 { p->next=current; last->next=p; } p=head; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); printf("请输入命令:1代表执行 0代表退出\n"); scanf("%d",&pos); } /*链表的插入操作*/ return 0; } /* 测试用例 1 2 15 4 10 100 78 0 */