#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int DataType;
struct Node
{
DataType data;
struct Node* next;
};
typedef struct Node Link,*pLink;
//变量//指针变量
/********1/创建链表********/ //头插法//类似栈
bool InsertNode(pLink* top,DataType data)
{
pLink pNew=(pLink)malloc(sizeof(Link));//1 申请节点空间
if(NULL==pNew)
return false;
pNew->data=data;//2 存值
//3 建立联系
pNew->next=*top;//top第一次为空
*top=pNew;
return true;
}
/******2 遍历节点*******/
void Show(pLink top)
{
while(top!=NULL)
{
printf(" %d",top->data);
top=top->next;
}
}
/******3 查找节点,成功返回数据地址,失败返回NULL******/
DataType* search(pLink top,DataType key)
{
while(NULL!=top && top->data!=key)
{
top=top->next;
}
if(NULL==top)
return NULL;
else
return &(top->data);
}
/********4 修改key的值********/
bool update(int key,pLink top,int newvalue)
{
DataType* pData=search(top,key);
if(pData!=NULL)
{
*pData=newvalue;
return true;
}
return false;
}
/********5 删除节点*********/
//找前驱节点
pLink frontNode(int key,pLink link)
{
pLink pfri=NULL,psec=link;
while(NULL!=psec && psec->data!=key)
{
pfri=psec;
psec=psec->next;
}
if(NULL!=psec)
return pfri;
else
return NULL;//是头结点或不存在的节点
}
//删除元素:
bool delete(int key,pLink* plink)
{
//13 12 11 10 9 头部/无此节点---无前驱
pLink pNode=frontNode(key,*plink);
pLink pLoc=NULL;
//头节点
if(NULL!=pNode)//非头节点
{
pLoc=pNode->next;//记录key节点
pNode->next=pNode->next->next;
}
else if((*plink)->data==key)//如果是头节点
{
pLoc=*plink;
*plink=(*plink)->next;
}
//查找成功
if(NULL!=pLoc)
{
free(pLoc);
return true;
}
return false;
}
void main()
{
pLink head=NULL;
InsertNode(&head,1);
InsertNode(&head,2);
InsertNode(&head,3);
Show(head);
putchar(10);
delete(3,&head);
Show(head);
putchar(10);
}
上面是老师的标准写法,对问题考虑很全面,然后我之前也自己看过一些教科书籍,对上面部分功能有不同的解法,给大家借鉴一下。
/****** 修改,把第n个元素修改为x*******/
void mod(pLink top,int n,DataType x)
{
int i=1;
while(i!=n)
{
top=top->next;
i++;
}
top->data=x;
}
/******** 删除节点*********/
void DeleteHead(pLink* top)
{
pLink head=*top;
*top=(*top)->next;//优先级问题!!没有括号报错(在非结构或联合中请求next)
free(head);
}
void DeleteMid(pLink top,int key)//删除中间和删除尾巴一样
{
pLink tmp;
while(top->next->data!=key)
{
top=top->next;
}
tmp=top->next;
top->next=top->next->next;
free(tmp);
}
/******** 尾插法*******/
void InsertNode1(pLink *top,DataType data)
{
pLink head;
head=*top;
pLink pNew=(pLink)malloc(sizeof(pLink));
pNew->data=data;
pNew->next=NULL;
if(head==NULL)
{
*top=pNew;
}
if(head!=NULL){
while(head->next!=NULL)
{
head=head->next;
}
head->next=pNew;
}
}