单链表的操作包括:创建单链表、输出单链表长度 、输出单链表、删除节点、插入节点、单链表排序、单链表逆置。虽然思路都很简单,但是真写程序类运行时就遇到各种错误。
- #include<iostream>
- using namespace std;
- struct node
- {
- int data;
- node *next;
- };
- //建立单链表
- node * creat()
- {
- node *head;
- head=(node *)malloc(sizeof(node));
- node *p=head;//保存下头
- while(1)
- {
- int x;
- scanf("%d",&x);
- if(x==0)
- break;
- node *s=(node *)malloc(sizeof(node));//增加一个节点
- s->data=x;
- p->next=s;
- p=s;
- }
- head=head->next;
- p->next=NULL;//注意结尾赋空
- return head;
- }
- //求单链表长度
- int length(node * head)
- {
- node *p=head;
- int len=1;
- while(p->next!=NULL)
- {
- p=p->next;
- len++;
- }
- return len;
- }
- //打印单链表
- void print(node *head)
- {
- node *p=head;
- while(p!=NULL)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- //删除单链表中的某元素
- node *del(node *head,int num)
- {
- node *p1,*p2;
- p1=head;
- while(p1->next!=NULL)
- {
- if(p1->data==num)
- break;
- else
- {
- p2=p1;
- p1=p1->next;
- }
- }
- if(p1->data==num)
- {
- if(p1==head)
- {
- head=p1->next;
- free(p1);
- }
- else
- {
- p2->next=p1->next;
- free(p1);
- }
- }
- else
- printf("%d cannot find",num);
- return head;
- }
- //单链表插入元素 原表升序排列
- node *insert(node *head,int num)
- {
- node *p1,*p2;
- p1=head;
- node *in=(node *)malloc(sizeof(node));
- in->data=num;
- while(p1->next!=NULL)
- {
- if(p1->data<num)//注意无等号
- {
- p2=p1;
- p1=p1->next;
- }
- else
- break;
- }
- if(head==p1)
- {
- in->next=p1;
- head=in;
- }
- if(p1->data>=num)//注意有等号
- {
- in->next=p2->next;p2->next=in;
- }
- else
- {
- p1->next=in;
- in->next=NULL;
- }
- return head;
- }
- //单链表升序排序
- node *sort(node *head)
- {
- node *p=head;
- int n=length(head);
- for(int i=1;i<n;i++)//注意i从1开始
- {
- p=head;
- for(int j=0;j<n-i;j++)
- {
- if(p->data>p->next->data)
- {
- int tmp=p->data;
- p->data=p->next->data;
- p->next->data=tmp;
- }
- p=p->next;
- }
- }
- return head;
- }
- //单链表逆置
- node *reserve(node *head)
- {
- node *p1=head;
- node *p2=head->next;
- while(p2)
- {
- node *p3=p2->next;//p3存下来
- p2->next=p1;
- p1=p2;
- p2=p3;
- }
- head->next=NULL;
- head=p1;
- return head;
- }
- int main()
- {
- node *head=creat();
- print(head);
- int n=length(head);
- printf("%d\n",n);
- del(head,4);
- print(head);
- sort(head);
- print(head);
- insert(head,5);
- print(head);
- node *hed=reserve(head);
- print(hed);
- return 1;
- }