<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>數據結構的一些講解,供學習者參考,也順帶作爲複習 </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 鏈表與順序表不同,它是一種動態的存儲結構,鏈表中每個結點佔用的存儲空間不是預先分配的,而是運行時系統根據需求生成的,因此建立單鏈表從空表開始,每讀入一個數據元素則申請一個結點,然後插在鏈表的頭部。下圖爲鏈表的構建過程,因爲是在鏈表的頭部插入,讀入數據的順序表和線性表的邏輯順序是相反的。</span>
鏈表建立
LinkList Creat_LinkList()
{
LNode *s;
int x;
printf("請輸入數據(輸入'0'表結束輸入):\t");
scanf("%d",&x);
while(x!=0)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
printf("請輸入數據(輸入'0'表結束輸入):\t");
scanf("%d",&x);
}
return L;
}
獲取某個位置的數據
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p=L;
int j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j==i)
return p;
else
return NULL;
}
定位到某個元素的結點
LNode *Locate_LinkList(LinkList L,int x)
{
LNode *p=L->next;
while(p!=NULL&&p->data!=x)
p=p->next;
return p;
}
插入算法1,i爲插入的位置,x爲插入的元素
int Insert_LinkList_1(LinkList L,int i,int x)
{
LNode *p,*s;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("參數i錯誤\n");
return 0;
}
else
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
插入算法2:表頭插入
LinkList Insert_LinkList_2(LinkList L,int x)
{
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
return L;
}
刪除鏈表某個位置的元素
int Del_LinkList(LinkList L,int i)
{
LinkList p,s;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("第i-1個結點不存在\n");
return -1;
}
else if(p->next==NULL)
{
printf("第i個結點不存在\n");
return 0;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}
計算鏈表的長度
int Length_LinkList(LinkList L)
{
LNode *p=L;
int j=0;
while(p)
{
p=p->next;
j++;
}
return j;
}
輸出鏈表內的所有元素
void OutputList(LinkList L)
{
LNode *p=L;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
}
主函數設計
void main()
{
LinkList H=NULL;
int item,model,addr;
while(1)
{
printf("請選擇操作:\n【1】創建鏈表\n【2】特定位置插入數據\n【3】表頭插入數據\n【4】特定元素刪除\n【5】表長度\n【6】查看鏈表\n【7】退出\n");
printf("請輸入:\t");
scanf("%d",&model);
fflush(stdin);
switch(model)
{
case 1:
H = Creat_LinkList();
OutputList(H);
break;
case 2:
while(1)
{
printf("請輸入插入的位置\t");
scanf("%d",&addr);
if(addr==0)
break;
printf("請輸入插入的數據\t");
scanf("%d",&item);
Insert_LinkList_1(H,addr,item);
}
OutputList(H);
break;
case 3:
while(1)
{
printf("請輸入插入的數據\t");
scanf("%d",&item);
if(item==0)
break;
H=Insert_LinkList_2(H,item);
}
OutputList(H);
break;
case 4:
while(1)
{
printf("請插入刪除的位置\t");
scanf("%d",&addr);
if(addr==0)
break;
Del_LinkList(H,addr);
}
OutputList(H);
break;
case 5:
printf("%d\n",Length_LinkList(H));
break;
case 6:
OutputList(H);
printf("\n");
break;
case 7:
exit(0);
default:
printf("輸入有誤,請重新輸入\n");
}
}
}
需要源代碼的歡迎下載,免積分,共同學習,家下來每天都會分享一篇,持續一個星期
http://download.csdn.net/detail/kevin_iot/9395889