关于链表的一个小程序:
/**************************链表*****************************/
/* 具备功能 */
/* 链表按元素位置插入 */
/* 链表按元素位置删除 */
/* 链表全表遍历 */
/* 链表整表创建(头插法) */
/* 链表整表创建(尾插法) */
/* 链表整表删除 */
/**************************链表*****************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct node //链表存储结构
{
int data;
struct node *next;
}Node;
void LinkedListInitialization(Node **LinkedList); //链表初始化
int LinkedListTraverse(Node *LinkedList); //链表全表遍历
int LinkedListInsert(Node **LinkedList, int position, int data); //链表按元素位置插入
int LinkedListDelete(Node **LinkedList, int position); //链表按元素位置删除
void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number); //链表整表创建(头插法)
void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number); //链表整表创建(尾插法)
void LinkedListDestroy(Node **LinkedList); //链表整表删除
void Welcome(); //菜单栏函数
int main()
{
int i=0;
int response;
int position;
int value;
Node *LinkedList=NULL; //设立头结点
LinkedListInitialization(&LinkedList); //链表初始化
printf("采用前插法,插入和删除传的参数改成了指向指针的指针\n--因为既然链表要变,那么就应该传指向链表指针的指针吧\n\n");
printf("*************************************************************************\n");
Welcome(); //菜单栏函数
while(scanf("%d", &response)==1)
{
switch(response)
{
case 1: printf("请输入要插入的链表位置和数值,用空格键分开(0--当前节点+1): ");
scanf("%d%d", &position, &value);
LinkedListInsert(&LinkedList, position, value); //链表插入, position表示插入位置,value是插入值
printf("\n");
break;
case 2: printf("请输入要删除的链表元素的位置(0--当前节点): ");
scanf("%d", &position);
LinkedListDelete(&LinkedList, position); //链表删除,position表示删除位置
printf("\n");
break;
case 3: printf("遍历链表的结果为: ");
LinkedListTraverse(LinkedList); //链表遍历
printf("\n");
printf("\n");
break;
case 4: return 1;
}
Welcome();
}
LinkedListDestroy(&LinkedList);
if(LinkedList->next==NULL)
printf("test!\n");
/*
Node *LinkedList=NULL; //设立头结点
int number=10;
int data[10]={1,2,3,4,5,6,7,8,9,10};
LinkedListCreateTailInsertion(&LinkedList, data, number);
LinkedListCreateHeadInsertion(&LinkedList, data, number);
LinkedListTraverse(LinkedList);
*/
return 1;
}
/*******************************链表初始化*******************************/
/* 因为实参是一个指针,故形参必须是一个二级指针,才能改变实参指针中的值*/
/* 给头结点分配空间,data域初始化为0, next域赋值NULL */
/*******************************链表初始化*******************************/
void LinkedListInitialization(Node **LinkedList)
{
*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->data = 0; //要加括号,->的优先级比*高
(*LinkedList)->next = NULL;
}
/*******************************链表全表遍历*****************************/
/*设定一个指针pointer指向头结点后面第一个元素,开始遍历,直到pointer为空 */
/*******************************链表全表遍历*****************************/
int LinkedListTraverse(Node *LinkedList)
{
Node *p;
p = LinkedList->next;
if(!p)
{
printf("没有数字,请先插入!");
return 1;
}
while(p->next != NULL)
{
printf("%d",p->data);
p = p->next;
}
printf("%d",p->data);
putchar(‘\n‘);
return 1;
}
/*******************************链表插入*****************************/
/* 在position位置进行插入数据data */
/* 使用pointer指针找到position前一个元素位置,而后进行插入操作 */
/*******************************链表插入*****************************/
int LinkedListInsert(Node **LinkedList, int position, int data)
{
int j;
Node * p,*s;
p = *LinkedList;
j = 1;
while(p && j < position) //找到下标position-1,因为有个头节点
{
p = p->next;
j++;
}
if(p== NULL ) //第i个节点不存在
{
printf("此时第i个节点不存在,请位置数值小一点,可以先遍历以下。\n\n");
return 1;
}
s = (struct node *)malloc(sizeof(Node));
s->data = data;
s->next = p->next;
p->next = s;
return 1;
}
/*******************************链表删除*****************************/
/* 在position位置删除结点 */
/* 使用pointer指针找到position前一个元素位置,而后进行删除操作 */
/*******************************链表删除*****************************/
int LinkedListDelete(Node **LinkedList, int position) //这里也是,应该加个*吧?
{
int j;
Node * p,*s;
p = *LinkedList;
j = 1;
while(p && j < position) //找到下标为position-1
{
p = p->next;
j++;
}
if(p==NULL || j!=position ||p->next ==NULL)
{
printf("输入的节点有误,请用1查清楚再输入!\n\n");
return 1;
}
s = p->next;
p->next = p->next->next;
free(s);
return 1;
}
/***************************链表整表创建(头插法)*******************/
/* 新加入的结点总是跟在头结点后边 */
/***************************链表整表创建(头插法)*******************/
void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number)
{
Node * s;
int i;
*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->next = NULL;
(*LinkedList)->data = 0;
for(i = 0; i < number; i++)
{
s = (struct node *)malloc(sizeof(Node));
s->data = data[i];
s->next =(* LinkedList)->next;
(*LinkedList) ->next = s;
}
}
/***************************链表整表创建(尾插法)*******************/
/* 设立一个尾指针tail,tail总是指向链表的末尾。新加入的结点链接到tail
的末尾,同时更新tail指针,使其指向新加入的结点(链表的末尾) */
/***************************链表整表创建(尾插法)*******************/
void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number)
{
Node * s,*r;
int i;
*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->next = NULL;
(*LinkedList)->data = 0;
r = *LinkedList;
for(i = 0; i < number; i++)
{
s = (struct node *)malloc(sizeof(Node));
s->data = data[i];
r->next = s;
r = s;
}
r->next = NULL;
}
/***************************链表整表删除*******************/
/* 设置p,q两个指针, q指向p的下一个元素。释放p指向的结点后,
把q的值赋给p, 同时q更新为下一个元素 */
/***************************链表整表删除*******************/
void LinkedListDestroy(Node **LinkedList)
{
Node *p,*q;
p =(*LinkedList)->next;
while(p->next !=NULL)
{
q = p;
p = p->next;
free(q);
}
(*LinkedList)->next = NULL;
}
/*******************菜单栏函数***********************/
void Welcome()
{
printf("欢迎光临链表!请按1,2,3,4选择对应功能:\n");
printf("1. 链表按元素位置插入:\n");
printf("2. 链表按元素位置删除:\n");
printf("3. 链表全表遍历:\n");
printf("4. 退出:\n\n");
}