2015.2.6
星期五,晴天
今天上课的内容不是很多,包括链表,栈和队列,但是代码量相比以前大了很多,栈和队列分别用了数组和链表两种方法实现了相应的功能。今天很郁闷的一件事是昨晚写的一个程序
让我纠结一天:将一个乱序的数组中的元素有序的插入到一个链表中。找不出来那里出错,边上课边分析,搞了一天,谢了三个不同的测试程序,得到相同的“出错”结果。最后放到
张恒斌的电脑上测试,没有问题。FUCK,程序本身跟本就没有问题,问题出来打印上面,在插入一个乱序的元素并且插一次打印一个元素,是不可能有序的把所有元素打印出来的,
插入程序和打印程序必须分开,教训啊!!!值得高兴的,编写的三个测试程序都是对的。
下面是单链表的程序,最后三个程序实现的是同一个功能:
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct node{
struct node *next;
data_t data;
}linknode_t,*linklist_t,*Pnode;
//linklist_t list;
linklist_t Create_Empty_Linklist()
{
linklist_t list;
list = (linklist_t)malloc(sizeof(linknode_t));
if(list)
{
list->next = NULL;
}
return list;
}
void Clear_Linklist(linklist_t list)
{
linklist_t next_node;
if(list == NULL)
{
return ;
}
while(NULL != list->next)
{
next_node = list->next;
list->next = next_node->next;
free(next_node);
}
return;
}
void Destory_Linklist(linklist_t list)
{
if(list != NULL)
{
Clear_Linklist(list);
free(list);
}
}
int Length_Linklist(linklist_t list)
{
int len = 0;
linklist_t next_node;
if(list == NULL)
{
return -1;
}
next_node = list->next;
while(next_node != NULL)
{
len++;
next_node = next_node->next;
}
return len;
}
int Empty_Linklist(linklist_t list)
{
if(NULL != list)
{
if(NULL == list->next)
{
return 1;
}
else
{
return 2;
}
}
else
{
return -1;
}
}
int Get_Linklist(linklist_t list,int at,data_t *x)
{
linklist_t new_node;
int new_at = 1;
if(list == NULL)
{
return -1;
}
if(at < 0)
{
return -1;
}
new_node = list->next;
while(new_node != NULL)
{
if(new_at == at)
{
if(x)
{
*x = new_node->data;
}
return 0;
}
new_node = new_node->next;
new_at++;
}
return -1;
}
int Set_Linklist(linklist_t list,int at,data_t x)
{
linklist_t new_node;
int new_at = 1;
if(list == NULL)
{
return -1;
}
if(at < 0)
{
return -1;
}
new_node = list->next;
while(new_node != NULL)
{
if(new_at == at)
{
new_node->data = x;
return 0;
}
new_at++;
new_node = new_node->next;
}
return -1;
}
int Insert_Linklist(linklist_t list,int at,data_t x)
{
linklist_t node_prev,node_at,node_new;
int new_at = 1;
if(list == NULL)
{
return -1;
}
if(at < 0)
{
return -1;
}
node_prev = list;
node_at = list->next;
node_new = (linklist_t)malloc(sizeof(linknode_t));
node_new->data = x;
node_new->next = NULL;
while(node_at != NULL)
{
if(new_at == at)
{
node_prev->next = node_new;
node_new->next = node_at;
return 0;
}
new_at++;
node_prev = node_at;
node_at = node_at->next;
}
node_prev->next = node_new;
return 0;
}
int Delete_Linklist(linklist_t list,int at)
{
linklist_t node_prev,node_at;
int new_at = 1;
if(list == NULL)
{
return -1;
}
if(at < 0)
{
return -1;
}
node_prev = list;
node_at = list->next;
while(node_at != NULL)
{
if(new_at == at)
{
node_prev->next = node_at->next;
free(node_at);
return 0;
}
new_at++;
node_prev = node_at;
node_at = node_at->next;
}
return -1;
}
void Reversel_Linklist(linklist_t list)
{
linklist_t node_prev, node_next;
node_prev = list->next;
list->next = NULL;
while(node_prev != NULL)
{
node_next = node_prev;
node_prev = node_next->next;
node_next->next = list->next;
list->next = node_next;
}
return;
}
int Insert_Order_Linklist(linknode_t **plist, int new_value)
{
linklist_t node_prev;
linklist_t node_new ;
while(((node_prev = *plist) != NULL) && (node_prev->data) < new_value )
{
plist = &node_prev->next;
}
node_new = (linklist_t)malloc(sizeof(linknode_t));
if(node_new == NULL)
{
return -1;
}
node_new->data = new_value;
node_new->next = node_prev;
*plist = node_new;
return 1;
}
int Insert_Order_Linklist1(linklist_t list, int new_value)
{
linklist_t node_prev;
linklist_t node_new ;
linklist_t node_at;
node_prev = list;
node_at = list->next;
node_new = (linklist_t)malloc(sizeof(linknode_t));
if(node_new == NULL)
{
return -1;
}
node_new->data = new_value;
while((node_at != NULL ) && (node_at->data < new_value))
{
node_prev = node_at;
node_at = node_at->next;
}
node_new->next = node_at;
node_prev->next = node_new;
return 1;
}
int Insert_Order_Linklist2(linklist_t list, int new_value)
{
linklist_t node_prev;
linklist_t node_new ;
linklist_t node_at;
node_prev = list;
node_at = list->next;
node_new = (linklist_t)malloc(sizeof(linknode_t));
if(node_new == NULL)
{
return -1;
}
node_new->data = new_value;
node_new->next = NULL;
while(node_at != NULL && node_at->data < new_value)
{
node_prev = node_at;
node_at = node_at->next;
}
if(node_at == NULL)
{
node_prev->next = node_new;
}
else
{
node_new->next = node_at;
node_prev->next = node_new;
}
return 1;
}
int main(int argc,char **argv)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int c[12] = { 18,10,15,16,14,12,13,17,20,19,22,21};
int b[12];
int i,j=0,length = 0;
data_t *p=&j;
linklist_t list;
putchar('
');
printf("a[] = {");
for(i = 0; i < 10; i++)
{
printf("%5d",a[i]);
}
printf("} ");
list = Create_Empty_Linklist();
Clear_Linklist(list);
Empty_Linklist(list);
printf("list ");
for(i = 0; i < 10; i++)
{
Insert_Linklist(list,i+1,a[i]);
Get_Linklist(list,i+1,&b[i]);
printf("->%d",b[i]);
}
printf("->NULL
");
printf("list_length = %d
",Length_Linklist(list));
Reversel_Linklist(list);
printf("list ");
for(i = 0; i < 10; i++)
{
Get_Linklist(list,i+1,&b[i]);
printf("->%d",b[i]);
}
printf("->NULL
");
Get_Linklist(list,5,p);
printf("linklist number five is => %d
",*p);
printf("==>delete five element of linklist
");
Delete_Linklist(list,5);
length=Length_Linklist(list);
printf("now list_length = %d
",length);
printf("list ");
for(i = 0; i < length; i++)
{
Get_Linklist(list,i+1,&b[i]);
printf("->%d",b[i]);
}
printf("->NULL
");
printf("==>modify the number five and insert an element 100 in three member
");
Set_Linklist(list,4,200);
Insert_Linklist(list,2,100);
length=Length_Linklist(list);
printf("now list_length = %d
",length);
printf("list ");
for(i = 0; i < length; i++)
{
Get_Linklist(list,i+1,&b[i]);
printf("->%d",b[i]);
}
printf("->NULL
");
printf("==>at last,the release list
");
Clear_Linklist(list);
printf("Empty list length = %d
",Length_Linklist(list));
Destory_Linklist(list);
list = NULL;
printf("now list_length after destory = %d
",Length_Linklist(list));
printf("==>create a list again ");
list = Create_Empty_Linklist();
Clear_Linklist(list);
Empty_Linklist(list);
list->next = NULL;
for(i = 0; i <12; i++)
{
Insert_Order_Linklist(&list ,c[i]);
}
length=Length_Linklist(list);
printf("list ");
for(i = 0; i < length; i++)
{
Get_Linklist(list,i+1,&b[i]);
printf("->%d",b[i]);
}
printf("->NULL
");
printf("list_length = %d
",Length_Linklist(list));
putchar('
');
return 0;
}
执行效果:
lg@lg-desktop:/mnt/hgfs/source test/pdf$ gcc testlink.c
lg@lg-desktop:/mnt/hgfs/source test/pdf$ ./a.out
a[] = { 1 2 3 4 5 6 7 8 9 10}
list ->1->2->3->4->5->6->7->8->9->10->NULL
list_length = 10
list ->10->9->8->7->6->5->4->3->2->1->NULL
linklist number five is => 6
==>delete five element of linklist
now list_length = 9
list ->10->9->8->7->5->4->3->2->1->NULL
==>modify the number five and insert an element 100 in three member
now list_length = 10
list ->10->100->9->8->200->5->4->3->2->1->NULL
==>at last,the release list
Empty list length = 0
now list_length after destory = -1
==>create a list again
list ->10->12->13->14->15->16->17->18->19->20->21->22->NULL
list_length = 12
lg@lg-desktop:/mnt/hgfs/source test/pdf$