单链表功能大全

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

单链表很全的例子,增加,删除,排序,都有了

#include <stdio.h>#include <stdlib.h>typedef struct node{int nDate;struct node *pstnext;}Node;//链表输出void output(Node *head){Node *p = head->pstnext;while(NULL != p){  printf("%d  ", p->nDate);   p = p->pstnext;}printf("\r\n");}//链表建立Node* creat(){Node *head = NULL, *p = NULL, *s = NULL;int Date = 0, cycle = 1;head = (Node*)malloc(sizeof(Node));if(NULL == head){  printf("分配内存失败\r\n");  return NULL;}head->pstnext = NULL;p = head;while(cycle){  printf("请输入数据且当输入数据为0时结束输入\r\n");  scanf("%d", &Date);  if(0 != Date)  {   s = (Node*)malloc(sizeof(Node));   if(NULL == s)   {    printf("分配内存失败\r\n");    return NULL;   }   s->nDate = Date;   p->pstnext = s;   p = s;  }  else  {   cycle = 0;  }}p->pstnext = NULL;return(head);}//单链表测长void length(Node *head){Node *p = head->pstnext;int j=0;while(NULL != p){  p = p->pstnext;  j++;}printf("%d\r\n", j);}//链表按值查找void research_Date(Node *head, int date){Node *p;int n=1;p = head->pstnext;while(NULL != p && date != p->nDate){  p = p->pstnext;  ++n;}if(NULL == p){  printf("链表中没有找到该值");}else if(date == p->nDate){  printf("要查找的值%d在链表中第%d个位置\r\n", date, n);}return;}//按序号查找void research_Number(Node *head, int Num){Node *p=head;int i = 0;while(NULL != p && i < Num){  p = p->pstnext;  i++;}if(p == NULL){  printf("查找位置不合法\r\n");}else if(i == 0){  printf("查找位置为头结点\r\n");}else if(i == Num){  printf("第%d个位置数据为%d\r\n", i, p->nDate);}}//在指定元素之前插入新结点void insert_1(Node *head, int i, int Newdate){Node *pre = head, *New = NULL;int j = 0;while(NULL != pre && j < i-1){   pre = pre->pstnext;  j++;}if(NULL == pre || j > i-1){  printf("插入位置不存在\r\n");}else{  New = (Node*)malloc(sizeof(Node));  if(NULL == New)  {   printf("分配内存失败\r\n");   return;  }  New->nDate = Newdate;  New->pstnext = pre->pstnext;  pre->pstnext = New;}}//在指定元素之后插入新结点void insert_2(Node *head, int i, int Newdate){Node *pre = head, *New = NULL;int j = 0;while(NULL != pre->pstnext && j < i){  pre = pre->pstnext;  j++;}if(j == i){  New = (Node*)malloc(sizeof(Node));  if(NULL == New)  {   printf("分配内存失败\r\n");   return;  }  New->nDate = Newdate;  New->pstnext = pre->pstnext;  pre->pstnext = New;}elseprintf("插入位置不存在\r\n");}}//删除指定结点void Delete_1(Node *head, int i3){Node *p = head, *pre = NULL;int j = 0;while(NULL != p && j < i3){  pre = p;  p = p->pstnext;  j++;}if(NULL == p){  printf("删除位置不存在\r\n");}else{  pre->pstnext = p->pstnext;  free(p);}}//指定删除单链表中某个数据,并统计删除此数据的个数int Delete_2(Node *head, int Delete_date){int count = 0;Node *p = head, *q;while(NULL != p->pstnext){  q = p->pstnext;  if(q->nDate == Delete_date)  {   p->pstnext = q->pstnext;   free(q);   ++count;  }  else  {   p = q;  }}return count;}//链表逆置void Reverse_list(Node *head){Node *q, *s;if(NULL == head->pstnext || NULL == head->pstnext->pstnext){  return;}q = head->pstnext->pstnext;head->pstnext->pstnext = NULL;while(NULL != q){  s = q->pstnext;  q->pstnext = head->pstnext;  head->pstnext = q;  q = s;}}//单链表的连接void connect_list(Node *head, Node *head_New){Node *p = head;while(NULL != p->pstnext){  p = p->pstnext;}p->pstnext = head_New->pstnext;}//单链表销毁void destroy_list(Node* head){    while (NULL != head){  Node* temp = head;  head = head->pstnext;  free(temp);}}main(){int date, num;    //待查找数据int i3;     //指定删除元素的位置int i1, i2, Newdate_1, Newdate_2;    //待插入的新数据int Delete_date, k;    //待删除的数据与其个数Node *Head = NULL;   //定义头结点Node *Head_New = NULL;//链表建立Head = creat();printf("输出建立的单链表\r\n");output(Head);//单链表测长printf("单链表长度为\r\n");length(Head);//链表按值查找printf("请输入待查找的数据\r\n");scanf("%d", &date);    research_Date(Head, date);//链表按序号查找printf("请输入待查找序号\r\n");scanf("%d", &num);research_Number(Head, num);//在指定第i1个元素之前插入新元素Newdateprintf("在指定第i个元素之前插入新元素Newdate");printf("请输入i与元素且以逗号间隔\r\n");scanf("%d,%d", &i1, &Newdate_1);insert_1(Head, i1, Newdate_1);printf("插入后新链表\r\n");output(Head); //在指定第i2个元素之后插入新元素Newdateprintf("在指定第i个元素之后插入新元素Newdate");printf("请输入i与元素且以逗号间隔\r\n");scanf("%d,%d", &i2, &Newdate_2);insert_2(Head, i2, Newdate_2);printf("插入后新链表\r\n");output(Head); //指定删除i3元素printf("删除元素的位置\r\n");scanf("%d", &i3);Delete_1(Head, i3);printf("删除后新链表\r\n");output(Head);//指定删除单链表中某个数据,并统计删除此数据的个数printf("请输入待删除的元素\r\n");scanf("%d", &Delete_date);k = Delete_2(Head, Delete_date);printf("删除后新链表\r\n");output(Head);printf("删除指定元素在链表中的个数为:");printf("%d\r\n", k);//单链表逆置Reverse_list(Head);printf("逆置后输出\r\n");output(Head);//单链表的连接printf("建立一个新链表\r\n");Head_New = creat();printf("输出新链表");output(Head);printf("将新链表连接到原来链表的尾部并输出\r\n");connect_list(Head, Head_New);output(Head);         destroy_list(Head);}下面是输出结果:


 VS2010下调试结果

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值