关于链表的一个小程序:
/**************************链表*****************************/
/* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/#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");}