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