前面有了链表的逆序打印程序,自己以为链表的顺序打印会容易很多,但是却遇到很多麻烦的事情.
经常运行出错.检查了一下是自己在链表初始化阶段出现了错误.
首先是程序头文件和声明
#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;
}
这些基本操作也是后面复杂操作的基础,慢慢学习吧.