一步一步复习数据结构和算法基础-链表(2)

 


前面有了链表的逆序打印程序,自己以为链表的顺序打印会容易很多,但是却遇到很多麻烦的事情.

经常运行出错.检查了一下是自己在链表初始化阶段出现了错误.

 

首先是程序头文件和声明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define true 1
#define false 0

typedef struct node
{
	int data;
	struct node *next;
}list,*linklist;

 

 

 

带有头结点链表的创建:

//creat a list without head and print in order
linklist CreatListWithHead(linklist plist)
{
	int number;
	linklist p;
	linklist temp = plist;
	while(scanf("%d",&number) != EOF)
	{
		p = (linklist)malloc(sizeof(list));
		if(!p){printf("malloc error.\n");exit(1);}

		p->data = number;
		temp->next = p;
		temp = p;
	}
	temp->next = NULL;
	return plist;
}

注意主函数的声明:

        plist = (linklist)malloc(sizeof(list));
	plist->next = NULL;
	printf("input a series of number ended with ctrl+z\n");
	plist = CreatListWithHead(plist);
	PrintListWithHead(plist);
	printf("\n");


这里面 plist 不仅仅要声明还要 malloc 一段内存,因为头结点的数据域虽然没有内容但是仍然占据一块数据域.


plist = (linklist)malloc(sizeof(list));
	plist->next = NULL;
	printf("input a series of number ended with ctrl+z\n");
	plist = CreatListWithHead(plist);
	PrintListWithHead(plist);
	printf("\n");


 

 
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define true 1
#define false 0

typedef struct node
{
	int data;
	struct node *next;
}list,*linklist;

linklist InitList(linklist plist);
linklist CreatListWithoutHead(linklist plist);
linklist CreatListWithHead(linklist plist);
void InsertListAtFront(linklist plist,int number,int goal);
void InsertListAtBack(linklist plist,int number,int goal);
void DeleteListAtFront(linklist plist,int number);
void DeleteListAtBack(linklist plist,int number);
void DeleteListAtPresent(linklist plist,int number);
int FindANumberInList(linklist plist,int number);

/*创建没有头结点的链表*/
linklist CreatListWithoutHead(linklist plist)
{
	int number;
	linklist p;
	
	/*输入数字到文件结尾 EOF(ctrl+z)*/
	while(scanf("%d",&number) != EOF)
	{
		p = (linklist)malloc(sizeof(list));
		if(!p){printf("malloc error.\n");exit(1);}

		p->data = number;
		p->next = plist;
		plist = p;
	}
	return plist;
}

/*创建有头结点的链表*/
//creat a list without head and print in order
linklist CreatListWithHead(linklist plist)
{
	int number;
	linklist p;
	linklist temp = plist;

	/*输入数字到文件结尾 EOF(ctrl+z)*/
	while(scanf("%d",&number) != EOF)
	{
		p = (linklist)malloc(sizeof(list));
		if(!p){printf("malloc error.\n");exit(1);}

		p->data = number;
		temp->next = p;
		temp = p;
	}
	temp->next = NULL;
	return plist;
}

/*打印链表(没有头结点)*/
void PrintListWithoutHead(linklist plist)
{
	while(plist)
	{
		printf("%d ",plist->data);
		plist = plist->next;
	}
}

/*打印链表(有头结点)*/
void PrintListWithHead(linklist plist)
{
	linklist temp = plist->next;
	while(temp)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
}

/*在链表中插入一个元素(指定位置的前面)*/
void InsertListAtFront(linklist plist,int number,int goal)
{
	linklist p = plist->next;
	linklist q = plist;
	linklist temp;
	while(p)
	{
		if(p->data == number)break;
		p = p->next;
		q = q->next;
	}
	if(p == NULL){printf("number does not exist.\n");exit(1);}
	temp = (linklist)malloc(sizeof(list));
	temp->data = goal;
	temp->next = q->next;
	q->next = temp;
}

/*在链表中插入一个元素(指定位置的后面)*/
void InsertListAtBack(linklist plist,int number,int goal)
{
	linklist p = plist->next;
	linklist temp;
	while(p)
	{
		if(p->data == number)break;
		p = p->next;
	}
	if(p == NULL){printf("number does not exist.\n");exit(1);}
	temp = (linklist)malloc(sizeof(list));
	temp->data = goal;
	temp->next = p->next;
	p->next = temp;
}

/*删除指定位置的节点*/
void DeleteListAtPresent(linklist plist,int number)
{
	linklist p = plist->next;linklist q=plist;
	linklist temp;
	while(p)
	{
		if(p->data == number)break;
		p = p->next;
		q = q->next;
	}
	if(plist->next == p){printf("you can not delete the head of list.\n");exit(1);}
	if(p == NULL){printf("postion dose not exist.\n");exit(1);}
	temp = (linklist)malloc(sizeof(list));
	temp->data = p->data;
	temp->next = p->next;
	q->next = temp->next;
	free(temp);
}

/*删除指定位置后面的节点*/
void DeleteListAtBack(linklist plist,int number)
{
	linklist p = plist->next;
	linklist temp;
	while(p)
	{
		if(p->data == number)break;
		p = p->next;
	}
	if(p->next == NULL){printf("this is the end of list.\n");exit(1);}
	if(p == NULL){printf("postion dose not exist.\n");exit(1);}
	temp = (linklist)malloc(sizeof(list));
	temp->data = p->next->data;
	temp->next = p->next->next;
	p->next = temp->next;
	free(temp);
}

/*在链表之中查询指定的节点*/
int FindANumberInList(linklist plist,int number)
{
	linklist p = plist->next;
	while(p)
	{
		if(p->data == number)
			return 1;
		p = p->next;
	}
	return 0;
}

/*程序的插入删除合并操作均以顺序链表为依据*/
int main()
{
	linklist plist;
	int number,goal;
	int result;

	/*逆序打印链表,带有头结点*/
	plist = NULL;
	printf("input a series of number ended with ctrl+z\n");
	plist = CreatListWithoutHead(plist);
	PrintListWithoutHead(plist);
	printf("\n");

	/*顺序打印链表,不带头结点*/
	plist = (linklist)malloc(sizeof(list));
	plist->next = NULL;
	printf("input a series of number ended with ctrl+z\n");
	plist = CreatListWithHead(plist);
	PrintListWithHead(plist);
	printf("\n");

	/*在链表中插入一个元素*/
	printf("inout a postion.\n");
	scanf("%d",&number);
	printf("input a number you want to insert.\n");
	scanf("%d",&goal);
	InsertListAtFront(plist,number,goal);
	PrintListWithHead(plist);
	printf("\n");
	
	printf("inout a postion.\n");
	scanf("%d",&number);
	printf("input a number you want to insert.\n");
	scanf("%d",&goal);
	InsertListAtBack(plist,number,goal);
	PrintListWithHead(plist);
	printf("\n");

	/*在链表中删除一个元素*/
	printf("inout a postion.\n");
	scanf("%d",&number);
	DeleteListAtBack(plist,number);
	PrintListWithHead(plist);
	printf("\n");
	
	/*在链表之中查找一个元素*/
	printf("input a number.\n");
	scanf("%d",&number);
	printf("the result of find the number is:\n");
	result = FindANumberInList(plist,number);
	printf("%s\n",result?"TRUE":"FALSE");

	return 0;
}

这些基本操作也是后面复杂操作的基础,慢慢学习吧.
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值