单链表基本操作

来源:互联网 发布:数据库爆破密码字典 编辑:程序博客网 时间:2024/05/21 21:37

//vs2005#include "stdafx.h"#include <iostream>typedef struct node{int data;struct node *next;}LNode,*LinkList;/*创建链表:创建一个有头结点的链表,头结点不存放数据,数据从第二个结点(表头结点)开始存放。有没有头结点链表的插入、删除、打印等操作会不同,有头结点通常操作起来更方便,例如可以方便的支持只有一个节点的链表删除结点。同时注意,对链表的操作中,插入和删除令p1=head,逆置令p1=head->next前者有利于遍历*/LinkList creat(){LinkList head,p,s; int x,flag=1;head=(LinkList)malloc(sizeof(LNode));//头指针p=head;printf("输入若干整数并以空格隔开,以回车结束:\n");char ch=' ';while(ch!='\n'){scanf("%d",&x);ch=getchar();//getchar要放在scanf后面if(flag){s=(LinkList)malloc(sizeof(LNode));s->data=x;//printf("%d",s->data);//printf("\n");p->next=s;//输入的第一个数作为第二个结点(表头结点)p=s;}else flag=0;}p->next=NULL;printf("创建成功:\n");return head;}/*删除节点:两种情况(1)删除第i个结点,直接删除即可(2)删除值为num的结点,要遍历整个链表,找出所有值为num的结点,全部删除下面的代码考虑较复杂的第二种情况(也可以使用递归实现)*/LinkList del(LinkList head,int num){LinkList p1,p2;p1=head;while(p1->next!=NULL){if(num!=p1->next->data){p1=p1->next;}else{p2=p1->next;p1->next=p1->next->next;free(p2);}}////////////////////////////////return head;}//逆置单链表LinkList reverse(LinkList head){LinkList p1,p2,p3;//p1=head;p1=head->next;if(p1==NULL)return head;if(p1->next!=NULL){p2=p1->next;p1->next=NULL;while(p2->next!=NULL){p3=p2->next;p2->next=p1;p1=p2;p2=p3;}p2->next=p1;head->next=p2;}printf("逆置成功:\n");return head;}/*插入操作,常见的操作有:(1)插入到指定位置(2)插入到有序链表中,插入后仍然保持有序*/LinkList insert(LinkList head){ LinkList p0,p1,p2; int num; p1=head; p0=(LinkList)malloc(sizeof(LNode)); printf("请输入一个要插入的整数并回车:\n"); char ch=' '; while(ch!='\n') {scanf("%d",&num);ch=getchar(); }  p0->data=num; if(head->next==NULL) {head->next=p0;p0->next=NULL;return head; } while(p1->next!=NULL&&p0->data>p1->next->data) p1=p1->next; if(p1->next==NULL) { p1->next=p0; p0->next=NULL; } else if(p0->data<=p1->next->data) { p0->next=p1->next; p1->next=p0; } printf("插入成功:\n"); return head;}//打印链表void print(LinkList head){LinkList p;if(head->next!=NULL){p=head->next;while(p->next!=NULL){printf("%d->",p->data);p=p->next;}printf("%d",p->data);}printf("\n");}int _tmain(int argc, _TCHAR* argv[]){LinkList p;p=creat();print(p);int num;printf("你要删除哪个元素,请输入:\n");scanf("%d",&num);p=del(p,num);print(p);p=insert(p);print(p);p=reverse(p);print(p);return 0;}