/*實現單向鏈表的增刪改查 */
#include <malloc.h>
#include <stdio.h>
#include<stdlib.h>
#define LEN sizeof(node)
typedef struct node
{
int num;
struct node *next;
}node,*pnode;
/*在鏈表頭進行插入,新節點成為頭節點,原頭節點成為新節點的下一個節點,頭節點指針后伊一位*/
void insert_head(pnode *phead,int data)
{
pnode p;
p=(pnode)malloc(sizeof(LEN));
if(NULL==p)
{
perror("malloc fail");
exit(1);
}
p->num=data;
p->next=(*phead);
(*phead)=p;
}
/*在鏈表尾進行插入*/
void insert_tail(pnode *phead,int data)
{
pnode p; // 插入的新結點
pnode p2=(*phead); //鏈表中的指針初始化,否則會發生段錯誤
p=(pnode)malloc(sizeof(LEN));
if(NULL==p)
{
perror("malloc fail");
exit(1);
}
p->next=NULL;
p->num=data;
if(*phead)
{
while(p2->next) //遍歷鏈表,找到鏈表末尾節點
{
p2=p2->next;
}
p2->next=p;
}
}
/*在鏈表頭進行刪除*/
void delate_head(pnode *phead)
{
if((*phead)==NULL)
{
return 0;
}else{
pnode p;
p=(*phead); //找到鏈表頭節點,保存后釋放,同時頭節點指針后移一位
(*phead)=(*phead)->next;
free(p);
}
}
/*在鏈表尾進行刪除*/
void delate_tail(pnode *phead)
{
pnode p;
pnode p1;
p=(*phead);
if(*phead)
{
while((p->next)!=NULL)
{
p1=p; //p1用來保存原來p的位置,所以應該先保存,再后移
p=p->next;
}
if(p1) //p1始終指向倒數第二個節點,但鏈表只有一個結點時,p1不存在,所以需要進行判斷
{
free(p);
p1->next=NULL;
}else{
free(p);
}
}
}
/*根據num來匹配想要想要尋找的節點*/
struct node *find_data(pnode phead,int data)
{
pnode p;
p=phead;
while(p!=NULL && (p->num) !=data) //遍歷鏈表
{
p=p->next;
}
if(p){ // 判斷查找數據是否存在
printf(" 您想查找的數據是:%d\n",p->num);
}else{
printf("你所查找的數據不存在\n");
}
return p;
}
/*根據data來刪除節點,要刪除節點為p->next,要刪除節點的上一節點為p,要刪除節點的下一節點為q*/
void delate_data( pnode *phead,int data)
{
pnode p,q;
p=(*phead);
if((*phead)->num==data)
{
delate_head(phead);
}else{
while((p->next)!=NULL &&(( p->next)->num) !=data) //定位到要刪除節點的上一節點
{
p=p->next;
}
if((p->next)==NULL){
printf("你所刪除的數據不存在\n");
}else{
q=p->next->next;
free(p->next);
p->next=q;
}
}
}
/*根據節點序列號來修改鏈表中的數據 */
void modify_data(pnode *phead,int x,int y) //參數分別為頭節點指針,修改的節點序,修改后的數據
{
int i=0;
pnode p=(*phead);
while(p){
if(i==x)
{
p->num=y;
break;
}
p=p->next;
i++;
}
if(i<x)
{
printf(" 你所輸入的序列號不合法\n ");
return 0;
}
}
void printf_list(pnode head)
{
while(head)
{
printf("%d\n",head->num);
head=head->next;
}
printf("\n");
}
void main(void)
{
struct node *head=NULL;
insert_head(&head,1); //測試前插
insert_head(&head,2);
insert_head(&head,3);
insert_head(&head,4);
insert_head(&head,5);
printf("前插成功\n");
insert_tail(&head,6); //測試后插
insert_tail(&head,7);
insert_tail(&head,8);
insert_tail(&head,9);
printf("后插成功\n");
delate_head(&head);
printf("前刪成功\n");
delate_tail(&head);
delate_tail(&head);
printf("后刪成功\n");
find_data(head,2);
printf("查找數據成功\n");
find_data(head,10); // 查找的數據不存在
delate_data(&head,2);
printf("刪除指定數據成功\n");
delate_data(&head,10); //刪除的數據不存在
modify_data(&head,2,15); //測試修改
modify_data(&head,6,15); //測試修改
printf_list(head); //測試打印
printf("遍歷成功\n");
}