C語言實現鏈表基本操作
之前說過順序表的基本操作。顯然,順序表有一個很大的缺點,就是做插入刪除操作的時候,往往要做很大量的元素移動的操作。這裏我們討論另外一種線性表的表示方法——鏈式存儲結構。由於它不需要邏輯上的相鄰的元素在物理位置上也相鄰,因此它沒有順序存儲結構所具有的弱點,但是同時也失去了順序表的可隨機存取的有點。
- 結構
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; //數據元素的類型,假設是int型的
typedef struct LNode{
ElemType data; //數據域
struct LNode *next; //下一個節點的指針
}LNode, *LinkList;
- 創建鏈表
//創建鏈表
void createList(LinkList &L,int n)
{
L = (LinkList)malloc(sizeof(ElemType));
L->next = NULL; //創建頭節點
LinkList p,q;
q = L;
for(int i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode)); //一個新的節點
printf("請輸入值");
scanf("%d",&p->data);
p->next = NULL;
q->next = p;
q = q->next;
}
}
- 遍歷輸出鏈表
//遍歷輸出鏈表
void toString(LinkList L)
{
LinkList p;
p = L->next;
printf("Head->");
while(p)
{
printf("%d->",p->data);
p = p->next;
}
printf("NULL\n");
}
- 插入一個元素
int LinkListInsert(LinkList L,int i,ElemType e)
{
LinkList p = L;
int j=0;
while(p && j<i-1)
{
p = p->next;
j++;
}
if(!p||j>i-1)
{
printf("給出的位置錯誤");
return -1;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
- 刪除一個元素
//刪除一個元素
int LinkListDelete(LinkList L,int i,ElemType &e)
{
LinkList p = L;
int j=0;
while(p && j<i-1)
{
p = p->next;
j++;
}
if(!p||!(p->next)||j>i-1)
{
printf("給出的位置錯誤");
return -1;
}
LinkList s = p->next;
p->next = s->next;
return 1;
}
- 主函數
int main()
{
int n ;
LinkList L;
printf("請輸入n\n");
scanf("%d",&n);
createList(L,n);
toString(L);
LinkListInsert(L,5,9);
toString(L);
int e;
LinkListDelete(L,6,e);
toString(L);
}
- 測試結果