學計算機的同鞋們都知道,我們偉大的數據結構中有個東西叫單鏈表,這東西跟單戀似的,苦中帶甜,甜中微苦。
下面我們就拉一拉單鏈表的建立、插入和刪除。咱們不整那些虛的,我也是剛開始寫,如有錯誤,希望各位大佬斧正指出。
本片使用尾插法進行操作
- 建立
在一切開始之前,我們先來個初始化,把未知的東西聲明一下,我們所學的C#、Java均是如此,原理不一,此處只是類比推理,方便理解。
初始化:申請頭節點
first=malloc(size);//malloc(size)函數申請節點空間
rear=first;
再依次插入元素節點
先申請空間
再存數據
再將rear向後移
只要是持續增加元素節點,這四步是不用變的
s=malloc(size);
s->data=x;//x是所需存入的數據
rear->next=s;
rear->=s;
循環結束將最後一個指針域指向NULL
rear->next=NULL;
- 插入
轉換一下指針指向
申請節點空間s,再將數據x賦給s的數據域,
再將1指針變成2,即將p->next賦給s->next,
再讓改變後的p->next指向s
s=malloc(size);
s->sata=x;
s->next=p->next;
p->next=s;
- 刪除
q=p->next;
x=q->data;
p->next=q->next;
free q;
整體運行實驗代碼
#include "stdio.h"
#include "stdlib.h"
typedef struct ss
{ int data;
struct ss *next;
}LNode;
LNode *Creat()
{
LNode *h,*p,*q;
int x;
h=(LNode *)malloc(sizeof(LNode));
h->next=NULL;
q=h;
scanf("%d",&x);
while(x!=-1)
{ p=(LNode *)malloc(sizeof(LNode));
p->data=x;
p->next=NULL;
q->next=p;
q=p;
scanf("%d",&x);
}
return h;
}
void Out(LNode *h)
{ LNode *p;
p=h->next;
if(p==NULL)
{ printf("空表!\n");
return;
}
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
}
void InsertList(LNode *h,int i,int e)
{
LNode *s,*p;
int j=1;
p=h->next;
while(p&&j<i-1)
{
p=p->next;
++j;
}
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
void DelList(LNode *h,int i)
{
LNode *p,*q;
int j=1;
int e;
p=h->next;
while(p&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
e=q->data;
if(q->next!=NULL)
p->next=q->next;
else
p->next=NULL;
free(q);
printf("\n刪除元素爲:%d",e);
}
void main()
{ printf("請輸入鏈表數,每輸一個,enter一下,‘-1’結束\n");
LNode *head;
int i,x;
head=Creat();
Out(head);
printf("\n請輸入插入位置(輸入-1結束):");
scanf("%d",&i);
printf("請輸入插入數據:");
scanf("%d",&x);
InsertList(head,i,x);
printf("插入後單鏈表爲:\n");
Out(head);
printf("\n請輸入刪除位置:");
scanf("%d",&i);
DelList(head,i);
printf("\n刪除後單鏈表爲:\n");
Out(head);
}
隨意輸出結果展示