今天没事做,重温了一下单链表的基本操作,运行的平台是ubuntu14.04上的GCC。
其中包括初始化单链表,向链表中添加元素,从链表中删除元素,遍历链表并打印,按元素查找,销毁链表。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int ID;
int data;
struct node *pNext;
}Node;
Node *head = NULL;
int init();
int addNode(int ID , int data);
int deleteNode_addr(int index);
void destroyNodeList();
void show(Node *list);
int find(int find_id);
void main()
{
init();
int a;
do
{
printf("1.增加 2.删除 3.打印 4.查找 0.退出\n");
scanf("%d",&a);
int x,y;
int m;
int t;
switch(a)
{
case 1:
printf("输入ID与data(中间用空格隔开):\n");
scanf("%d %d",&x,&y);
if (addNode(x,y)==1) printf("添加成功!\n");
else printf("添加失败!");
break;
case 2:
printf("输入删除的位置:\n");
scanf("%d",&m);
if (deleteNode_addr(m)==1) printf("删除成功!\n");
else printf("删除失败!\n");
break;
case 3:
printf("打印这个表:\n");
show(head);
break;
case 4:
printf("输入需要查找的ID:");
scanf("%d",&t);
if(find(t)==1) printf("表中有这个ID!\n");
else printf("表中没有这个ID!\n");
default:
break;
}
}while(a>0&&a<=4);
destroyNodeList();
printf("清除这个表成功!");
}
int init()
{
head = (Node*) malloc(sizeof(Node));
if(NULL == head)
{
printf("初始化错误!\n");
return 0;
}
else
{
head->data = 0;
head->ID = 0;
head->pNext = NULL;
printf("初始化成功!\n");
return 1;
}
}
int addNode(int ID , int data)
{
if(NULL == head)
{
return 0;
}
Node* p = head->pNext;
Node* q = head;
while(NULL != p)
{
q = p;
p = p->pNext;
}
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->ID = ID;
new_node->data = data;
new_node->pNext = NULL;
q->pNext = new_node;
new_node->pNext = NULL;
return 1;
}
int deleteNode_addr(int index)
{
if(index == 0)
{
printf("删除无效,表已是空表!\n");
return 0;
}
if(NULL == head)
{
printf("删除无效,表已是空表!\n");
return 0;
}
Node* p = head->pNext;
int length = 0;
while(NULL != p)
{
length ++;
p = p->pNext;
}
if(length < index)
{
printf("输入表的长度错误!\n");
return 0;
}
else
{
Node* q = head;
p = head;
int i;
for(i=0;i<index;i++)
{
q = p;
p = p->pNext;
}
Node* t = p->pNext;
q->pNext = t;
free(p);
return 1;
}
}
void destroyNodeList()
{
if(NULL == head)
{
return;
}
if(NULL == head->pNext)
{
free(head);
head = NULL;
return;
}
Node* p = head->pNext;
while(NULL != p)
{
Node* tmp = p;
p = p->pNext;
free(tmp);
}
free(head);
head = NULL;
}
void show(Node *list)
{
Node *p;
p=list->pNext;
if(!p)
{
printf("链表为空!\n");
}
while(p)
{
printf("ID=%d, data=%d, ID_addr=%p, data_addr=%p\n", p->ID ,p->data , &p->ID ,&p->data);
p=p->pNext;
}
}
int find(int find_id)
{
Node *p;
p=head->pNext;
while(p)
{
if(p->ID==find_id)
return 1;
p=p->pNext;
}
return 0;
}