鏈表的簡單創建——C程序設計

題目:創建固定長度的單向鏈表

程序分析:鏈表是動態分配存儲空間的鏈式存儲結構,

其包括一個“頭指針”變量,其中第0個結點稱爲整個鏈表的頭結點,頭結點中存放一個地址,該地址指向一個元素,頭結點一般不存放具體數據,只是存放第一個結點的地址。

鏈表中每一個元素稱爲“結點”,每個結點都由兩部分組成:存放數據元素的數據域和存儲直接後繼存儲位置的指針域。指針域中存儲的即是鏈表的下一個結點存儲位置,是一個指針。多個結點鏈接成一個鏈表。

最後一個結點的指針域設置爲空(NULL),作爲鏈表的結束標誌,表示它沒有後繼結點。

使用結構體變量作爲鏈表中的結點,因爲結構體變量成員可以是數值類型,字符類型,數組類型,也可以是指針類型,這樣就可以使用指針類型成員來存放下一個結點的地址,使其它類型成員存放數據信息。

在創建列表時要動態爲鏈表分配空間,C語言的庫函數提供了幾種函數實現動態開闢存儲單元。

malloc()函數實現動態開闢存儲單元:

      malloc函數原型爲:void *malloc(unsigned int size);

      其作用是在內存的動態存儲區中分配一個長度爲size的連續空間,函數返回值是一個指向分配域起始地址的指針(類型爲void)。如果分配空間失敗(如,內存空間不足),則返回空間指針(NULL

代碼如下:

#include<stdio.h>
#include<malloc.h>
struct LNode
{
int data;
struct LNode *next;
};
/*上面只是定義了一個結構體類型,並未實際分配內存空間
只有定義了變量才分配內存空間*/
struct LNode *creat(int n)
{
int i;
struct LNode *head,*p1,*p2;
/*head用來標記鏈表,p1總是用來指向新分配的內存空間,
p2總是指向尾結點,並通過p2來鏈入新分配的結點*/
int a;
head=NULL;
for(i=1;i<=n;i++)
{
p1=(struct LNode *)malloc(sizeof(struct LNode));
/*動態分配內存空間,並數據轉換爲(struct LNode)類型*/
printf("請輸入鏈表中的第%d個數:",i);
scanf("%d",&a);
p1->data=a;
if(head==NULL)/*指定鏈表的頭指針*/
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
p2->next=NULL;/*尾結點的後繼指針爲NULL(空)*/
}
return head;/*返回鏈表的頭指針*/
}
void main()
{
int n;
struct LNode *q;
printf("請輸入鏈表的長度:/n");
scanf("%d",&n);
q=creat(n);/*鏈表的頭指針(head)來標記整個鏈表*/
printf("/n鏈表中的數據:/n");
while(q)/*直到結點q爲NULL結束循環*/
{
printf("%d ",q->data);/*輸出結點中的值*/
q=q->next;/*指向下一個結點*/
}
}


題目:創建雙向鏈表

程序分析:雙向鏈表的結點有兩個指針域,一個指向其直接後繼,另一個指向其直接前驅。其中第一個結點的前驅爲NULL(頭結點爲第0個結點),最後一個結點的後繼爲NULL

代碼如下:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct node
{
char name[20];
struct node *prior,*next;
}stud;
/*雙鏈表的結構定義*/
stud *creat(int n)/*創建雙鏈表函數*/
{
stud *p,*h,*s;
int i;
h=(stud *)malloc(sizeof(stud));/*動態分配內存賦予頭結點*/
h->name[0]='/0';/*爲頭結點的內容置空*/
h->prior=NULL;/*頭結點的前驅和後繼置爲NULL*/
h->next=NULL;
p=h;/*將頭結點賦值於p,p總是指向鏈表的最後一個結點*/
for(i=0;i<n;i++)
{
s=(stud *)malloc(sizeof(stud));/*動態分配內存*/
p->next=s;/*讓p結點的後繼指向s*/
printf("請輸入第%d個同學的名字:",i+1);
scanf("%s",s->name);
s->prior=p;/*讓s結點的前驅指向p結點*/
s->next=NULL;/*讓s結點的後繼指向NULL,s總是指向新分配的結點*/
p=s;/*p總是指向鏈表的最後一個結點*/
}
p->next=NULL;/*雙鏈表的最後一個結點的後繼指向NULL*/
return(h);
}
stud *search(stud *h,char *x)/*查找*/
{
stud *p;/*用於定位雙鏈表中的結點*/
char *y;
p=h->next;
while(p)
{
y=p->name;
if(strcmp(y,x)==0)/*strcmp函數比較兩個字符串的內容是否相等*/
return (p);/*若找到,返回當前結點*/
else
p=p->next;/*不相等就繼續向下查找*/
}
printf("信息未找到/n");
}
void del(stud *p)/*刪除*/
{
if(p->next!=NULL)/*確定要刪除的結點是否爲最後一個結點,最後一個結點後繼爲NULL*/
p->next->prior=p->prior;/*p結點後繼的前驅賦予p結點的前驅*/
p->prior->next=p->next;/*p結點前驅的後繼賦予p結點的後繼*/
free(p); /*釋放p結點的內存空間*/
}
void dip(stud *p) /*輸出雙鏈表*/
{
while(p)
{
printf("%s ",&*(p->name));
/*%s格式符要用字符數組的起始地址即第一個字符的地址,也可用(p->name)*/
p=p->next;
}
}
void main()
{
int number;
char sname[20];
stud *head,*sp; /*head用來標記雙鏈表,sp用來定位結點*/
puts("請輸入鏈表的長度:");
scanf("%d",&number);
head=creat(number);
sp=head->next; /*sp指向雙鏈表的第一個結點(頭結點爲第0個結點)*/
printf("/n雙鏈表內的數據爲:/n");
dip(sp); /*輸出鏈表*/
printf("/n請輸入要查找的學生姓名:/n");
scanf("%s",sname);
sp=search(head,sname); /*查找鏈表中的結點*/
printf("/n你想要找的名子是:%s/n",&*(sp->name));
del(sp); /*刪除sp結點*/
sp=head->next;
printf("/n現在的雙鏈表是:/n");
dip(sp); /*輸出鏈表*/
printf("/n");
}


題目:創建循環鏈表

程序分析:循環鏈表與普通鏈表的操作基本一致,

只是鏈表中最後一個結點的指針域指向頭結點,是鏈表形成一個環,

從表中的任一結點出發均可找到表中的其它結點

在算法中循環遍歷鏈表是判斷條件不再是p->next是否爲空,

而是是否等於鏈表的頭指針。

代碼如下:

#include<stdio.h>
#include<malloc.h>
typedef struct student
{
int num;
struct student *next;
}LNode,*LinkList;
/*定義鏈表的結構體類型*/
LinkList creat(void)
{
LinkList head;
LNode *p1,*p2;
/*p1用來指向新分配的結點,
p2始終指向鏈表的最後一個結點,
同時用p2->next=p1來鏈入新結點*/
char a;
head=NULL;/*新創建的鏈表的頭指針爲NULL(空)*/
a=getchar();
while(a!='/n')
{
p1=(LNode *)malloc(sizeof(LNode));/*動態分配內存空間*/
p1->num=a;/*爲結點的數據域賦值*/
if(head==NULL)/*指定鏈表的頭指針*/
head=p1;
else
p2->next=p1;/*將新結點p1鏈入鏈表*/
p2=p1;/*p2指向剛鏈入的新結點,即讓p2始終指向鏈表的最後一個結點*/
a=getchar();
}
p2->next=head;/*鏈表的最後一個結點的後繼指向頭結點*/
return head;
}
void main()
{
LinkList L1,head;
printf("/n請輸入循環鏈表內容:/n");
L1=creat();/*創建鏈表*/
head=L1;
printf("/n循環鏈接表:/n");
printf("%c",L1->num);
L1=L1->next;
while(L1!=head)
{
/*判斷條件爲循環到頭結點結束*/
printf("%c",L1->num);
L1=L1->next;
}
printf("/n/n");
}


發佈了18 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章