按照課本敲了一遍代碼,但是整個程序有很多bug運行不起來。
僅做參考
#include <stdio.h>
#include <stdlib.h>
/*定義結點的結構體*/
typedef int datatype;
typedef struct linknode{
datatype data;//數據域,用來存放數據
struct linknode * next;//指針域
}LinkNode,*LinkList;//定義結點類型爲LinkNode,結點指針類型爲LinkList
/*/*建立線性鏈表,這是在鏈表的頭部插入,
所以讀入數據的順序和線性表中的邏輯順序是相反的
LinkNode *CreateLinkList(){
LinkNode *head,*p,*s;
int x;
int z=1,n=0;//n用來記錄表長
head =NULL;//初始化頭指針爲空
printf("\t建立一個線性鏈表\n");
printf("\t說明:請逐個輸入整數,輸入“-1”爲結束\n");
while (z){
printf("\t\t輸入:");
scanf("%d",&x);
if(x!=-1){
s=(LinkNode*)malloc(sizeof(LinkNode));
n++;//表長+1
s->data=x;
s->next=head;
head=s;//每次循環用頭結點來代替當前結點,然後在當前結點前面插入結點。
}
else z=0;
}
return head;
}*/
/*在鏈表的尾部插入數據,使其順序結構與邏輯結構相同*/
LinkNode *CreateLinkList(){
LinkNode *head,*p,*s;//頭指針,尾指針,新結點
int x=0;//輸入的數據
int z=1,n=0;//n用來儲存表長
head->next=NULL;//頭結點爲空
p=head;//空表時,尾指針指向頭結點
printf("建立一個線性鏈表。");
printf("請逐個輸入元素數據,結束標記爲-1\n");
while(x!=-1){
printf("請輸入第%d個元素:",z);
z++;
scanf("%d",&x);
//創建一個新的結點
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
p->next = s;
s->next = NULL;
}
/* while(z){
printf("輸入:");
scanf("&d",x);
if(x!=-1){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next=NULL;
if(!head){
head = s;
}
else{
p->next = s;
}
p=s;
n++;
}
else z = 0 ;
}*/
return head;
}
/*求表長算法,
思路設一個移動指針p和計數器n,初始化後,p所指結點後面若還有結點,p向後移動,計數器+1*/
/*設L是帶頭結點的鏈表,(線性表的長度不包括頭結點)*/
int LenList1(LinkList L){
LinkNode *p=L;//p指向頭結點
int n=0;
while(p->next!=NULL){
p=p->next;
n++;
}
return n;
}
/*L是不帶頭結點的鏈表*/
int LenList2(LinkList L){
LinkNode *p=L;
int n=0;
if(p==NULL) return 0;//空表的情況下
n=1; //非空表的情況下,p所指的是第一個結點
while(p->next!=NULL){
p=p->next;
n++;
}
return n;
}
/*按序號查找SearchList(L,i)
從鏈表的第一個元素結點開始,判斷當前結點是否是第i個,
是,則返回該結點的指針,否則繼續下一個,知道鏈表結束。
若沒有第i個結點則返回爲空*/
LinkNode *SearchList1(LinkList L,int i){
//在帶頭結點的線性鏈表L中查找第i個元素結點,找到後返回其指針,否則返回空
LinkNode *p = L;
int j = 0;
while(p->next!=NULL&&j<i){
p=p->next;
j++;
}
if(j==i) return p;
else return NULL;
}
/*按值查找SearchList2(L,x)
從鏈表的第一個元素結點開始判斷當前接待你的值是否等於x,
若是,返回該節點的指針,否則繼續判斷下一個,直到鏈表結束
若找不到,則返回空*/
LinkNode *SearchList2(LinkList L,datatype x){
LinkNode *p = L->next;
while(p!=NULL&&p->data!=x) p = p->next;
if(p->data == x)return p;
else return NULL;
}
/*插入結點,設p指向線性鏈表中的某一個結點,s指向待插入的結點
後插操作:①s->next = p->next
②p->next = s 兩條語句的順序不能交換
前插操作:與後插不投的是:首先要找到*p的前驅*q
然後再完成*q之後插入*s,設線性鏈表頭指針爲L操作如下
q=L;
while(q->next!=p) q = q->next;
s->next = q->next;
q->next = s;*/
/*插入算法的算法思路
1,找到第一個節點,若不存在則結束,若存在則繼續下一步。
2,申請一個新節點,並複製。
3,將新節點插入*/
void InsertList(LinkList head,int i,datatype x){
LinkNode *s,*p;
p= head;
int j = 0;
while(p!=NULL&&j<i){//找到插入位置
j++;
p=p->next;//後移指針
}
if(p!=NULL){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;//插入結點
s->next = p->next;//修改指針
p->next = s;
/* n++ ;//表的長度+1 ,需在結構體中添加n即鏈表的長度*/
}
else printf("\t線性表爲空或插入位置查出\n");
}
/*刪除結點
要刪除節點q,首先要找到結點q的前驅結點p,
然後移動指針,釋放內存就可以了*/
LinkNode* DeleteList(LinkNode* head,datatype x){//head爲頭指針,x爲待刪除結點的值
//刪除不帶頭結點的單鏈表中結點x,返回刪除指定結點後的單鏈表頭指針
LinkNode *p,*q;
if(head ==NULL){
printf("\t單鏈表爲空!\n");
return head;
}
if(head->next==NULL){
if(head->data!=x){//只有一個結點,並且不是待刪結點
printf("\t未找到待刪除的結點!");
return head;
}
else{ // 只有一個結點,並且是待刪結點
delete head;//釋放被刪除結點的空間
return NULL;
}
}
q=head;
p=head->next;
while(p!=NULL&&p->data!=x){//查找待刪除的結點
q=p;
p=p->next;
}
if(p!=NULL){
q->next=p->next;
delete p;
/* n--;需在鏈表的結構體中添加n即鏈表的長度*/
printf("\t%d已經被刪除",x);
} else{
printf("\t未找到待刪除的結點!\n");
}//這是刪除不帶頭結點的鏈表的元素的算法,寫出一個帶頭結點的刪除算法
}
int main(){
LinkNode * newLink = CreateLinkList();
}