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

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

题目练习:从终端输入一组数据(大于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;
}


 

发布了21 篇原创文章 · 获赞 3 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fafactx/article/details/14121457