大学基本功没有打好。。。。链表真的很考验指针的基本功。
题目练习:从终端输入一组数据(大于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 L
LinkList 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;
else
r->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;
}