#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode //定義一個結構體
{
Elemtype data; //結點的資料域
struct LNode *next; //節點的指標域
}LNode , *LinkList; //指標型別
int InitList(LinkList L) //帶有頭節點的單鏈表的初始化
{
L= (LinkList)malloc(sizeof(LNode));
if (!L) //儲存分配失敗退出
{
printf("分配記憶體失敗!\n");
exit(0);
}
L->next = NULL; //空表長度為null
return 0;
}
int LengthList(LinkList L) //計算鏈表長度
{
int length = 0;
LinkList p;
p = L->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
int GetElem(LinkList L, int i, Elemtype e) //用e回傳L中第i個元素值
{
LinkList p; //初始化,p指向首元結點,計數器j=1
int j = 1;
p = L->next; //順序鏈表向后掃描,直到p為慷訓者p指向第i個元素
while (p && j < i)
{
p = p->next; //p指向下一個元素
++j;
}
if (!p || j > i) //i不合法
{
printf("查詢不到該元素!\n");
return 0;
}
e = p->data;
return 0;
}
void CreateList_F(LinkList L,int n) //頭插法創建一個單鏈表,n為要插入的元素個數
{
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("請輸入您要插入元素的個數:");
scanf("%d", &n);
printf("請輸入你要插入的元素值(用空格隔開):");
for (i = n; i >0;--i)
{
p = (LNode*)malloc(sizeof(LNode));
scanf_s("%d", &p->data);
p->next = L->next;
L->next = p;
}
}
int InsertList_L(LinkList L, int i, Elemtype e) //在L中第i個位置插入元素e
{
LinkList p, s;
int j = 0;
p = L;
while (p && j < i) //尋找第i-1結點
{
p = p->next;
++j;
}
if (!p || j > i) exit(1); //i大于表長+1或者小于1
s = (LinkList)malloc(sizeof(LNode)); //生成新結點s
s->data = e; //將結點的資料域置為e
s->next = p->next; //將結點s插入L中
p->next = s;
return 0;
}
int DeleteList_L(LinkList L, int i) //洗掉L中第i個元素,并用e回傳其值
{
LinkList p, q;
int j = 0;
p = L;
printf("請輸入要洗掉的結點位置:");
while (p->next && j < i-1) //尋找第i個結點,并令p指向其前驅
{
p = p->next;
++j;
}
if (!(p->next) || j > i) exit(1); //洗掉位置不合理
q = p->next; //臨時保存被洗掉結點的地址以備釋放
p->next = q->next; //改變洗掉結點的前驅結點指標域
free(q); //釋放
return 0;
}
void ShowList(LinkList L) //列印整個鏈表
{
LinkList p;
p = L->next;
if (p == NULL)
{
printf("這是一個空鏈表!\n");
}
printf("單鏈表");
while (p)
{
printf(" -> %d", p->data);
p = p->next;
}
printf("\n");
}
main()
{
LinkList L;
int n;
int i,k;
printf("單鏈表的操作:\n");
printf("\t1.頭插法建立單鏈表\n");
printf("\t2.輸出單鏈表\n");
printf("\t3.洗掉結點\n");
printf("\t4.退出\n");
do
{
printf("選擇所需功能: ");
scanf("%d",&k);
switch(k)
{
case 1:CreateList_F( L, n);
break;
case 2:printf("單鏈表為:\n");
ShowList(L);
break;
case 3:
DeleteList_L( L, i);
break;
case 4:printf("退出");
exit(0);
default:printf("輸入錯誤\n");
exit(0);
}
}while(1);
}
uj5u.com熱心網友回復:
int InitList(LinkList L)
{
L= (LinkList)malloc(sizeof(LNode)); //修改形參沒有用處,離開這個函式形參就結束存在了
if (!L)
{
printf("分配記憶體失敗!\n");
exit(0);
}
L->next = NULL;
return 0;
}
uj5u.com熱心網友回復:
C和C++ 完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.htmlC和C++ 演算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html
uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode //定義一個結構體
{
Elemtype data; //結點的資料域
struct LNode *next; //節點的指標域
}LNode , *LinkList; //指標型別
int InitList(LinkList L) //帶有頭節點的單鏈表的初始化
{
L= (LinkList)malloc(sizeof(LNode));
if (!L) //儲存分配失敗退出
{
printf("分配記憶體失敗!\n");
exit(0);
}
L->next = NULL; //空表長度為null
return 0;
}
int LengthList(LinkList L) //計算鏈表長度
{
int length = 0;
LinkList p;
p = L->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
int GetElem(LinkList L, int i, Elemtype e) //用e回傳L中第i個元素值
{
LinkList p; //初始化,p指向首元結點,計數器j=1
int j = 1;
p = L->next; //順序鏈表向后掃描,直到p為慷訓者p指向第i個元素
while (p && j < i)
{
p = p->next; //p指向下一個元素
++j;
}
if (!p || j > i) //i不合法
{
printf("查詢不到該元素!\n");
return 0;
}
e = p->data;
return 0;
}
void CreateList_F(LinkList *L,int n) //頭插法創建一個單鏈表,n為要插入的元素個數
{
int i;
LinkList p;
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
printf("請輸入您要插入元素的個數:");
scanf("%d", &n);
printf("請輸入你要插入的元素值(用空格隔開):");
for (i = n; i >0;--i)
{
p = (LNode*)malloc(sizeof(LNode));
//scanf_s("%d", &p->data);
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
int InsertList_L(LinkList L, int i, Elemtype e) //在L中第i個位置插入元素e
{
LinkList p, s;
int j = 0;
p = L;
while (p && j < i) //尋找第i-1結點
{
p = p->next;
++j;
}
if (!p || j > i) exit(1); //i大于表長+1或者小于1
s = (LinkList)malloc(sizeof(LNode)); //生成新結點s
s->data = e; //將結點的資料域置為e
s->next = p->next; //將結點s插入L中
p->next = s;
return 0;
}
int DeleteList_L(LinkList L, int i) //洗掉L中第i個元素,并用e回傳其值
{
LinkList p, q;
int j = 0;
p = L;
//printf("請輸入要洗掉的結點位置:");
while (p->next && j < i-1) //尋找第i個結點,并令p指向其前驅
{
p = p->next;
++j;
}
if (!(p->next) || j > i) exit(1); //洗掉位置不合理
q = p->next; //臨時保存被洗掉結點的地址以備釋放
p->next = q->next; //改變洗掉結點的前驅結點指標域
free(q); //釋放
return 0;
}
void ShowList(LinkList L) //列印整個鏈表
{
LinkList p;
p = L->next;
if (p == NULL)
{
printf("這是一個空鏈表!\n");
}
printf("單鏈表");
while (p)
{
printf(" -> %d", p->data);
p = p->next;
}
printf("\n");
}
//main()
int main()
{
LinkList L;
int n;
int i,k;
printf("單鏈表的操作:\n");
printf("\t1.頭插法建立單鏈表\n");
printf("\t2.輸出單鏈表\n");
printf("\t3.洗掉結點\n");
printf("\t4.退出\n");
do
{
printf("選擇所需功能: ");
scanf("%d",&k);
switch(k)
{
case 1:CreateList_F(&L, n);
break;
case 2:printf("單鏈表為:\n");
ShowList(L);
break;
case 3:
printf("請輸入要洗掉的結點位置: ");
scanf("%d", &i);
DeleteList_L( L, i);
break;
case 4:printf("退出");
exit(0);
default:printf("輸入錯誤\n");
exit(0);
}
}while(1);
}
供參考~
uj5u.com熱心網友回復:
洗掉和顯示輸出鏈表函式,增加對空鏈表的判斷及反饋,供參考:int DeleteList_L(LinkList L, int i) //洗掉L中第i個元素,并用e回傳其值
{
LinkList p, q;
int j = 0;
p = L;
if(L == NULL){
printf("這是一個空鏈表!\n");
return -1;
}
//printf("請輸入要洗掉的結點位置:");
while (p->next && j < i-1) //尋找第i個結點,并令p指向其前驅
{
p = p->next;
++j;
}
if (!(p->next) || j > i) exit(1); //洗掉位置不合理
q = p->next; //臨時保存被洗掉結點的地址以備釋放
p->next = q->next; //改變洗掉結點的前驅結點指標域
free(q); //釋放
return 0;
}
void ShowList(LinkList L) //列印整個鏈表
{
LinkList p;
if (L == NULL)
{
printf("這是一個空鏈表!\n");
return;
}
printf("單鏈表");
p = L->next;
while (p)
{
printf(" -> %d", p->data);
p = p->next;
}
printf("\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280383.html
標籤:C語言
上一篇:Java多對多網路通訊的實作
下一篇:C語言嵌套回圈
