單鏈表及其基本操作的實現
請在以下給出的部分源程式基礎上補全程式碼,完成單鏈表的C語言程式。然後再主函式通過呼叫單鏈表的操作中完成一下任務:首先定義一個單鏈表例項(變數),並初始化,採用尾插法向其中錄入10個整數(ElemType為int型別);然後,在第5個結點處插入一個新結點(值為5),再把第8個結點刪除;最後打印出所有元素。
/*①單鏈表資料結構定義*/
//結點定義
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
//連結串列定義
typedef struct
{
LNode* head; //指向頭結點的指標
int length; //連結串列長度
}LinkList;
/*②單鏈表基本操作介面定義*/
//初始條件:線性表L已經初始化
//採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status CreateFromHead(LinkList &L);
//初始條件:線性表L已經初始化
//採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束
Status CreateFromTail(LinkList &L) ;
//初始條件:線性表L已經存在
//打印出所有元素
void PrintElem(LinkList L);
//初始條件:線性表L已經存在
//查詢第i個結點,若找到(1≤i≤n),則由e返回其值
Status GetElem_L(LinkList L, int i,ElemType &e);
//初始條件:線性表L已經存在
//在單鏈線性表L的第i個元素之前插入元素e
Status ListInsert_L(LinkList &L, int i, ElemType e);
//初始條件:線性表L已經存在
//刪除第i個元素,並由e返回其值
Status ListDelete_L(LinkList &L, int i, ElemType &e);
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef int Status ; typedef int ElemType ; //結點定義 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //單鏈表的初始化 Status InitList_L(LinkList &L); //初始條件:線性表L已經初始化 //採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束 Status CreateFromHead(LinkList &L); //初始條件:線性表L已經初始化 //採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束 Status CreateFromTail(LinkList &L) ; //初始條件:線性表L已經存在 //打印出所有元素 void PrintElem(LinkList L); //初始條件:線性表L已經存在 //查詢第i個結點,若找到(1≤i≤n),則由e返回其值 Status GetElem_L(LinkList L, int i,ElemType &e); //初始條件:線性表L已經存在 //在單鏈線性表L的第i個元素之前插入元素e Status ListInsert_L(LinkList &L, int i, ElemType e); //初始條件:線性表L已經存在 //刪除第i個元素,並由e返回其值 Status ListDelete_L(LinkList &L, int i, ElemType &e); //單鏈表的初始化 Status InitList_L(LinkList &L) { L =(LNode *)malloc(sizeof(LNode)); //申請結點空間 if(L == NULL) //判斷是否有足夠的記憶體空間 printf("申請記憶體空間失敗\n"); L->next = NULL; //將next設定為NULL,初始長度為0的單鏈表 return OK; } //初始條件:線性表L已經初始化 //採用頭插法建立一個單鏈表,元素型別為整形,輸入-9999時結束 Status CreateFromHead(LinkList &L) { LinkList s; char c; L=(LNode*)malloc(sizeof(LNode));//為頭結點分配儲存空間 L->next=NULL; c = getchar(); while(c != '$') { /*為讀入的字元分配儲存空間*/ s=(LNode*)malloc(sizeof(LNode)); s->data=c; s->next=L; L=s; } return OK; } //初始條件:線性表L已經初始化 //採用尾插法建立一個單鏈表,元素型別為整形,輸入-9999時結束 Status CreateFromTail(LinkList &L) { { LinkList r, s; int c; L=(LNode * )malloc(sizeof(LNode));/*為頭結點分配儲存空間*/ L->next=NULL; r=L; /*r指標始終動態指向連結串列的當前表尾*/ printf("請依次輸入字元資料('-9999'表示輸入結束):\n"); scanf("%d",&c); while(c != -9999)/*標誌,初值為1。輸入“-9999”時flag為0,建表結束*/ { s=(LNode*)malloc(sizeof(LNode)); s->data=c; r->next=s; r=s ; scanf("%d",&c); } r->next=NULL; } return OK; } //初始條件:線性表L已經存在 //在單鏈線性表L的第i個元素之前插入元素e Status ListInsert_L(LinkList &L, int i, ElemType e) { LinkList s,p=L; int j = 0; while (p&&j < i-1) { // 尋找第i-1個結點 p = p->next; ++j; } if (!p || j > i-1) return ERROR; // i小於1或者大於表長 s = (LinkList)malloc(sizeof(LNode)); // 生成新結點 s->data = e; s->next = p->next; // 插入L中 p->next = s; return OK; } // LinstInsert_L //初始條件:線性表L已經存在 //刪除第i個元素,並由e返回其值 Status ListDelete_L(LinkList &L, int i, ElemType &e) { LinkList p=L,q; int j = 0; while (p->next && j < i-1) { // 尋找第i個結點,並令p指向其前趨 p = p->next; ++j; } if (!(p->next) || j > i-1) return ERROR; // 刪除位置不合理 q = p->next; p->next = q->next; // 刪除並釋放結點 e = q->data; free(q); return OK; } // ListDelete_L //初始條件:線性表L已經存在 //打印出所有元素 void PrintElem(LinkList L) { LinkList p=L->next ; printf("當前的連結串列元素為:"); while(p) { printf(" %d",p->data); p=p->next; } printf("\n"); } //初始條件:線性表L已經存在 //查詢第i個結點,若找到(1≤i≤n),則由e返回其值 Status GetElem_L(LinkList L, int i,ElemType &e) { LNode *p; int j; p=L->next; j=1; // 從頭結點開始掃描 while (p&&j<i) { p=p->next; ++j; /* 掃描下一結點 */ } /* 已掃描結點計數器 */ if(!p||i>j) return ERROR; e=p->data; return OK; } void main() { LinkList L; printf("**************尾插法建立單鏈表*******************\n"); printf("向單鏈表錄入十個整數\n"); CreateFromTail(L); PrintElem(L); printf("\n在第5個結點處插入一個新結點(值為5)\n"); ListInsert_L(L,5,5); PrintElem(L); printf("\n第8個結點刪除後\n"); ListDelete_L(L,8,L->data); PrintElem(L); system("pause"); }