链表操作全内容:
1,链表创建
2,创建头结点(赋值)
3,输出当前链表
4,连接节点形成链表
5,插入节点函数
6,删除节点函数
7,伪尾插法
8,测试并运行上述代码
9,打印地址了解计算机运行代码的规则
1,链表创建
typedef struct List//创建链表
{
char data;
struct List*next;
}LNode,*NodePtr;
2,创建头结点(赋值)
NodePtr startList()//创建链表头结点
{
NodePtr Header=(NodePtr)malloc(sizeof(LNode));
Header->data='\0';
Header->next=NULL;
return Header;
}
3,输出当前链表
void printList(NodePtr Header)//输出链表
{
NodePtr p=Header->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
4,连接节点形成链表
void NewList(NodePtr Header,char paraChar)//连接节点
{
NodePtr p,q;
q=(NodePtr)malloc(sizeof(LNode));//申请一个节点来放需要连接的元素
q->data=paraChar;
q->next=NULL;
p=Header;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
方法:创建节点来放想要连接的数据人后连接到头节点后,如此往复
5,插入节点函数
void insertList(NodePtr Header,int paraPosition,char paraChar)//插入节点
{
NodePtr p,q;//申请两个空节点
p=Header;//令p指针指向链表
for(int i=0;inext; //让0位置等于第一个节点元素
if(p==NULL) //判断该元素是否为NULL
{
printf("超出链表范围,无法插入\r\n");//如果是,则无法在1位置插入元素(已经超过链表范围)
return;//直接结束进程
}
}
q=(NodePtr)malloc(sizeof(LNode));//申请一片节点空间
q->data=paraChar;
q->next=p->next;//插入操作
p->next=q;
}
6,删除节点函数
void deletList(NodePtr Header,char paraChar)//删除指定元素
{
NodePtr p,q;
p=Header;
while((p->next!=NULL)&&(p->next->data!=paraChar))//先判断该节点的next是为NULL,再判断此处元素是否为目标元素
{
p=p->next;//如果不是目标元素则往后移一位
}
if(p->next==NULL)//如果此处为NULL则链表遍历结束未找到目标元素而无法删除
{
printf("无法删除:%c\r\n",paraChar);
return;
}
q=p->next;//删除元素操作
p->next=p->next->next;
free(q);
}
7,伪尾插法
void lastInsert(NodePtr Header,char paraChar)//伪尾插法
{
NodePtr p,q;
q=(NodePtr)malloc(sizeof(NodePtr));
q->data=paraChar;
q->next=NULL;
p=Header;
while(p->next!=NULL)//遍历到NULL的位置
{
p=p->next;
}
q->next=p->next;//连接节点
p->next=q;
}
方法:一直遍历直到NULL,遍历到此处后就可以从尾部连接节点
8,测试并运行上述代码
void trialInsertDelete()//测验上述函数
{
NodePtr tempList=startList();//先创建一个节点指针指向头结点
printList(tempList);
NewList(tempList,'c');
NewList(tempList,'o');
NewList(tempList,'m');
NewList(tempList,'e');
printf("当前链表为:");
printList(tempList);
deletList(tempList,'o');
deletList(tempList,'x');
deletList(tempList,'m');
printf("删除节点后链表为:");
printList(tempList);
insertList(tempList,1,'o');
printf("插入节点后链表为:");
printList(tempList);
lastInsert(tempList,'z');
lastInsert(tempList,'s');
printf("伪尾插结果为:");
printList(tempList);
}
9,打印地址了解计算机运行代码的规则
void addressTest()//打印位置理解计算机运行代码过程
{
LNode test1,test2;
test1.data=7;
test1.next=NULL;
test2.data=4;
test2.next=NULL;
printf("the address is :%d %d %d\r\n",&test1,&test1.data,&test1.next);
printf("the address is :%d %d %d\r\n",&test2,&test2.data,&test2.next);
}
最后奉上全部代码
#include
#include
typedef struct List//创建链表
{
char data;
struct List*next;
}LNode,*NodePtr;
NodePtr startList()//创建链表头结点
{
NodePtr Header=(NodePtr)malloc(sizeof(LNode));
Header->data='\0';
Header->next=NULL;
return Header;
}
void printList(NodePtr Header)//输出链表
{
NodePtr p=Header->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
void NewList(NodePtr Header,char paraChar)//连接节点
{
NodePtr p,q;
q=(NodePtr)malloc(sizeof(LNode));//申请一个节点来放需要连接的元素
q->data=paraChar;
q->next=NULL;
p=Header;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
void insertList(NodePtr Header,int paraPosition,char paraChar)//插入节点
{
NodePtr p,q;//申请两个空节点
p=Header;//令p指针指向链表
for(int i=0;inext; //让0位置等于第一个节点元素
if(p==NULL) //判断该元素是否为NULL
{
printf("超出链表范围,无法插入\r\n");//如果是,则无法在1位置插入元素(已经超过链表范围)
return;//直接结束进程
}
}
q=(NodePtr)malloc(sizeof(LNode));//申请一片节点空间
q->data=paraChar;
q->next=p->next;//插入操作
p->next=q;
}
void deletList(NodePtr Header,char paraChar)//删除指定元素
{
NodePtr p,q;
p=Header;
while((p->next!=NULL)&&(p->next->data!=paraChar))//先判断该节点的next是为NULL,再判断此处元素是否为目标元素
{
p=p->next;//如果不是目标元素则往后移一位
}
if(p->next==NULL)//如果此处为NULL则链表遍历结束未找到目标元素而无法删除
{
printf("无法删除:%c\r\n",paraChar);
return;
}
q=p->next;//删除元素操作
p->next=p->next->next;
free(q);
}
void lastInsert(NodePtr Header,char paraChar)//伪尾插法
{
NodePtr p,q;
q=(NodePtr)malloc(sizeof(NodePtr));
q->data=paraChar;
q->next=NULL;
p=Header;
while(p->next!=NULL)//遍历到NULL的位置
{
p=p->next;
}
q->next=p->next;//连接节点
p->next=q;
}
void trialInsertDelete()//测验上述函数
{
NodePtr tempList=startList();//先创建一个节点指针指向头结点
printList(tempList);
NewList(tempList,'c');
NewList(tempList,'o');
NewList(tempList,'m');
NewList(tempList,'e');
printf("当前链表为:");
printList(tempList);
deletList(tempList,'o');
deletList(tempList,'x');
deletList(tempList,'m');
printf("删除节点后链表为:");
printList(tempList);
insertList(tempList,1,'o');
printf("插入节点后链表为:");
printList(tempList);
lastInsert(tempList,'z');
lastInsert(tempList,'s');
printf("伪尾插结果为:");
printList(tempList);
}
void addressTest()//打印位置理解计算机运行代码过程
{
LNode test1,test2;
test1.data=7;
test1.next=NULL;
test2.data=4;
test2.next=NULL;
printf("the address is :%d %d %d\r\n",&test1,&test1.data,&test1.next);
printf("the address is :%d %d %d\r\n",&test2,&test2.data,&test2.next);
}
int main()
{
trialInsertDelete();
addressTest();
}
总结:对于单链表,过程上应该先创建头结点,然后才能在头结点后面连接节点并进行链表的插入以及删除等一系列操作,指针是必不可少的工具,要熟练掌握指针的操作。