算法学习第二课链表C语言实现

来源:互联网 发布:kindle 推送 知乎周刊 编辑:程序博客网 时间:2024/06/04 18:06

大学基本功没有打好。。。。链表真的很考验指针的基本功。

题目练习:从终端输入一组数据(大于10个),以0作为结束标志,将数据存放在一个链表中(结束标志0不包括在内),打印链表中的值,然后删除第5个元素,打印输出,在最后释放掉链表。

#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next;} LNode,*LinkList;//LNode *L <==> LinkList LLinkList CreatLinkList(int n)//创建一个含n元素的链表{LinkList p,r,list = NULL;ElemType e;int i;for(i=1;i<=n;i++){scanf("%d",&e);//输入结点内容p = (LinkList)malloc(sizeof(LNode));//给新结点开辟内存p->data = e;p->next = NULL;if(!list)//list 为head只有第一个元素的地址list = p;elser->next = p;r = p;//r 为临时变量用于中间桥梁}return list;//返回链表的头}void InsertList(LinkList *list,LinkList q,ElemType e){LinkList p;p = (LinkList)malloc(sizeof(LNode));//为新结点开辟内存p->data = e;if(!*list)//空链表时候{*list = p;p->next = NULL;}else{p->next = q->next;   //插入p结点到q结点后边q->next = p;}}void DelLink(LinkList *list,LinkList q){LinkList r;if(q == *list){*list = q->next;free(q);}else{for(r=*list;r->next!=q;r=r->next);//找到q的前一个结点if(r->next != NULL){r->next = q->next;free(q);}}}void DestroyLinkList(LinkList *list){LinkList p,q;p = *list;while(p)//释放掉每一个链表结点{q = p->next;free(p);p = q;}*list = NULL;}//test main //int main(){int e,i;LinkList list1,list2;list1 = list2 = CreatLinkList(1);scanf("%d",&e);while(e){InsertList(&list1,list2,e);list2 = list2->next;scanf("%d",&e);}list2 = list1;printf("The content of the linklist\n");while(list2){printf("%d",list2->data);list2 = list2->next;}    list2 = list1;printf("\nDelete the fifth element\n");for(i=0;i<4;i++){list2 = list2->next;}DelLink(&list1,list2);list2 = list1;while(list2){printf("%d",list2->data);list2 = list2->next;}DestroyLinkList(&list1);while(1);return 0;}


 

 

 

 

原创粉丝点击