當前位置:首頁 » 編程語言 » c語言教學視頻單鏈表
擴展閱讀
qq群聊怎麼能全刪除 2023-01-29 03:26:56
維盟web認證模板 2023-01-29 03:24:36

c語言教學視頻單鏈表

發布時間: 2022-11-29 03:27:56

『壹』 編寫一個c語言程序 實現單鏈表的基本操作

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct Node
{
int data;
struct Node * pNext;
} * PNODE, NODE;

PNODE establish_list (void);
void traverse_list (PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead);
void insert_list(PNODE pHead, int pos, int val);
int delete_list(PNODE pHead, int pos, int val);
void freeer(PNODE pHead);

int main(void)
{
PNODE pHead;
int len, i, j, val;
pHead = establish_list();
traverse_list(pHead);

if(is_empty(pHead))
printf("鏈表為空\n");
else
printf("鏈表不空\n");

len = length_list(pHead);
printf("鏈表的長度為: %d\n", len);

sort_list(pHead);
traverse_list(pHead);

printf("請輸入您要在第幾個節點插入\n");
scanf("%d", &i);
printf("請輸入您要在第%d個節點插入的值\n", i);
scanf("%d", &j);
insert_list(pHead, i, j);
traverse_list(pHead);
printf("請輸入您要第幾個刪除的節點\n");
scanf("%d", &i);
val = delete_list(pHead, i, val);
printf("您刪除的節點值為: %d\n", val);
traverse_list(pHead);
freeer(pHead);

return 0;
}

PNODE establish_list(void)//初始化鏈表,返回頭結點地址
{
int val, len;
PNODE Tem;
PNODE pNew;
PNODE pHead;

pHead = (PNODE)malloc(sizeof(NODE));
Tem = pHead;
if(NULL == pHead)
{
printf("分配失敗");
exit(-1);
}
Tem->pNext = NULL;
printf("請輸入您要定義節點的長度: ");
scanf("%d", &len);

for (int i=0;i<len;++i)
{
printf("請輸入第%d個節點的值: ", i+1);
scanf("%d", &val);

pNew = (PNODE)malloc(sizeof(NODE));

if(NULL == pNew)
{
printf("分配失敗");
exit(-1);
}
pNew->data = val;//首先把本次創建的新節點的值付給新節點的數據域
Tem->pNext = pNew;//然後使用臨時的節點變數的指針域保存了新節點的地址,也就是指向了新節點
pNew->pNext = NULL;//如何再不循環,新節點成為最後一個節點
Tem = pNew;//把本次分配的新節點完全的賦給Tem,Tem就成為了這次新節點的影子,那麼下次分配新節點時可以使用上個新節點的數據
}
return pHead;
}

void traverse_list(PNODE pHead)
{
PNODE p = pHead;//使用P是為了不改寫頭結點里保存的地址
p = pHead->pNext;//使P指向首節點

while(p != NULL)//P本來就是頭結點的指針域,也就是首節點的地址,既然是地址就可以直接判斷p是否等於NULL
{
printf("%d ", p->data);
p = p->pNext;//使P每循環一次就變成P的下一個節點
}
}

bool is_empty(PNODE pHead)
{
if(NULL == pHead->pNext)
return true;
else
return false;
}

int length_list(PNODE pHead)
{
PNODE p = pHead->pNext;
int len = 0;

while(p != NULL)
{
len++;
p = p->pNext;
}
return len;
}

void sort_list(PNODE pHead)
{
int i, j, t, len;
PNODE p, q;
len = length_list(pHead);

for(i=0,p=pHead->pNext;i<len;i++,p=p->pNext)//逗號後只是為了找到下一個節點,因為不是數組,所以不能使用下標來++
{
for(j=0,q=pHead->pNext;j<len;j++,q=q->pNext)
if(q->data > p->data)//這里的大小與號可以決定是升序還是降序,如果是大於號就是升序,反之小於號就是降序
{
t = q->data;
q->data = p->data;
p->data = t;
}
}

return;
}

void insert_list(PNODE pHead, int pos, int val)
{
int i;
PNODE q = pHead;
PNODE p = pHead;
if(pos > 0 && pos <= length_list(pHead))
{
for(i=0;i<pos;i++)
{
q = q->pNext;//q就是要插入的連接點
}
for(i=1;i<pos;i++)
{
p = p->pNext;//p就是要插入連接點的前一個節點
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
p->pNext = pNew;
pNew->data = val;
pNew->pNext = q;
}
else if(pos > length_list(pHead))//追加
{
PNODE t;
t = pHead;
PNODE PN;
PN = (PNODE)malloc(sizeof(NODE));
if(PN == NULL)
printf("分配失敗");
else
while(t->pNext != NULL)
{
t = t->pNext;//使T->pNext成為尾結點
}
PN->data = val;//給新節點賦予有效數據
t->pNext = PN;//使尾結點的指針域指向了新的結點
PN->pNext = NULL;//新節點成為尾結點
}
else
printf("error\n");
return;
}

int delete_list(PNODE pHead, int pos, int val)
{
int i, j;
PNODE q, p;
q = pHead;
p = pHead;

if(pos > 0 && pos <= length_list(pHead))//保證刪除的是節點的有效數
{
for(i=0;i<pos;i++)
{
p = p->pNext;
}
for(j=1;j<pos;j++)
{
if(pos == 0)
q = pHead;
else
q = q->pNext;
}
q->pNext = p->pNext;
val = p->data;

free(p);
return val;
}
else
printf("error");

}

void freeer(PNODE pHead)
{
PNODE pT = pHead;
while(NULL != pHead->pNext)
{
free(pT);
pT = pT->pNext;
}

return;
}
/*
好久以前寫的一個鏈表了,有排序,插入,刪除,輸出,判斷是否為空,甚至還有釋放堆中內存的功能
*/

『貳』 C語言全套教學視頻

C語言程序設計

提取碼:8uar復制這段內容後打開網路網盤手機APP,操作更方便哦!

若資源有問題歡迎追問~

『叄』 求數據結構單鏈表C語言視頻教程

網路搜 清華嚴蔚敏數據結構視頻教程
就在前幾個視頻裡面

『肆』 用C語言實現對單鏈表的基本操作

#include<stdio.h>
#include<stdlib.h>

typedefintDataType;

typedefstructnode{
DataTypemember;
structnode*next;
}*LinkList,*pNode;

//初始化鏈表
LinkListGetEmptyList(){
LinkListhead=(pNode)malloc(sizeof(structnode));
head->member=0;
head->next=NULL;
returnhead;
}


//在非增鏈表中插入結點
voidInsertNode(LinkListhead,DataTypex){
pNodep,q;
for(p=head;p->next!=NULL;p=p->next){
if(p->next->member<=x){
q=(pNode)malloc(sizeof(structnode));
q->member=x;
q->next=p->next;
p->next=q;
return;
}
}
q=(pNode)malloc(sizeof(structnode));
q->member=x;
q->next=p->next;
p->next=q;
}

//新結點插入為首結點
voidPushNode(LinkListhead,DataTypex){
pNodep=(pNode)malloc(sizeof(structnode));
p->member=x;
p->next=head->next;
head->next=p;
}

//刪除結點
intDeleteNode(LinkListhead,DataTypex){
pNodep,q;
for(p=head;p!=NULL;p=p->next){
if(p->next->member==x){
q=p->next;
p->next=q->next;
free(q);
return1;//成功刪除member(第一個)為x的結點
}
}
return0;//沒有找到member為x的結點
}

//查找結點
intFindNode(LinkListhead,DataTypex){
pNodep;
for(p=head->next;p!=NULL;p=p->next){
if(p->member==x)return1;//找到了
}
return0;//沒有找到
}

//銷毀鏈表
voidDestroyList(LinkListhead){
pNodeq,p=head;
while(p){
q=p;
p=q->next;
free(q);
}
head=NULL;
}

//遍歷鏈表
voidShowList(LinkListhead){
pNodep=head->next;
while(p!=NULL){
printf("%d",p->member);
p=p->next;
}
printf(" ");
}

intmain(){
DataTypex,res;
LinkListhead=GetEmptyList();
printf("輸入一個整數('q'toquit):");
while(scanf("%d",&x)==1){
InsertNode(head,x);//創建非增鏈表
printf("輸入一個整數('q'toquit):");
}
fflush(stdin);
ShowList(head);
printf("輸入待查找的整數:");
scanf("%d",&x);
res=FindNode(head,x);
if(res)printf("找到了。 ");
elseprintf("沒找到! ");
printf("輸入待刪除的整數:");
scanf("%d",&x);
res=DeleteNode(head,x);
if(res)printf("成功刪除。 ");
elseprintf("沒找到數據為:%d的結點! ",x);
ShowList(head);
DestroyList(head);
return0;
}

『伍』 C語言,單鏈表

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef struct LNode{ //定於鏈表
int data;
struct LNode *next;
}Lnode,*LinkList;
LinkList initlist(LinkList L) //創建鏈表,創建頭結點
{
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
return L;
}
void creatlist(LinkList L) //初始化鏈表
{
LinkList p=L,s;
int e;
printf("please enter the numbers and -1 to end:\n");
scanf("%d",&e);
while(e!=-1) //輸入-1結束
{
scanf("%d",&e);
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
p->next=s;
p=s;
}
p->next=NULL;
}
void insertelem(LinkList L,int e) //在單鏈表中增添e
{
LinkList p=L,s;
while(p->next&&p->next->data<e)
p=p->next;
if(!p->next||p->next->data>e)
{
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
int deletelem(LinkList L,int e) //在單鏈表中刪除e
{
LinkList p=L,q;
while(p->next&&p->next->data<e)
p=p->next;
if(!p->next||p->next->data>e)
return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}
void printlist(LinkList L) //輸出鏈表中所有元素
{
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(void)
{
LinkList l=NULL;
int i,e;
l=initlist(l);
creatlist(l);
printlist(l);
printf("please enter the number you want to insert:\n");
scanf("%d",&e);
insertelem(l,e);
printf("the list after insert element is:\n");
printlist(l);
printf("please enter the number you want to delet:\n");
scanf("%d",&e);
if(deletelem(l,e))
{
printf("the list after delete is:\n");
printlist(l);
}
else
printf("the element doexn't exit\n");
return 0;
}

『陸』 C語言實現單鏈表問題

//童鞋,你的表頭沒了。。。其他的函數我不看了,這個是鏈表尾插法的建立與輸出,你仔細看到底哪裡錯了,有很多語法錯誤,如有不懂留言

#include <stdio.h>
#include <stdlib.h>

typedef int Type;

typedef struct SS
{
int Element;
struct SS *Next;
}Node;

void Print_List(Node *head);
void Insert(Type I_Element,Node *head);

void Insert(Type I_Element,Node *head)
{
Node *L = NULL;
Node *p = NULL;

L = head;

while (L->Next != NULL)
{
L = L->Next;
}

p = (Node *) malloc (sizeof(Node));
if(p == NULL)
{
printf("Out of memory!!!");
exit(0);
}
else
{
p->Element = I_Element;
p->Next = NULL;//

L->Next = p;
}
}

void Print_List(Node *head)
{
Node *p = head->Next;

while(p != NULL)
{
printf("%d", p->Element);
p = p->Next;
}
printf("\n");
}

int main()
{
int i;
Node *head = (Node *)malloc(sizeof(Node));

if (NULL == head)
{
exit(0);
}

head->Next = NULL;//建立空表頭

for (i=0; i<10; i++)
{
Insert(i, head);
}

Print_List(head);
}

『柒』 c語言單向鏈表

name 保存在結構體單元的name[20] 數組里;
typedef struct node
{
char name[20];
struct node *link;
}stud;
這是你前面定義的結構體變數,一個單元包含兩個部分,一個用來存儲name的數組name[20],一個用來存放下一個單元地址的指向結構體node的指針。
假設該單元的地址是p,那麼p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一個單元的地址。

--------------》你看不懂的部分如下《-----------------
p->link=s; /*把s的地址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連接起來了*/
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name); /*在當前結點s的數據域中存儲姓名*/
s->link=NULL;
p=s;
}

在這段代碼前面是分配一個結構體單元空間,s是這個新分配空間的地址,p是鏈表的尾節點的地址,以鏈表形式說,新分配的應當跟在它後面。
按上面所講,p->link用來存放下一單元的地址,因此有:
p->link=s; 這樣新節點就成為鏈表的一部分了。

printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name);
這兩句,是對將需要輸入的名字讀入並且存放在新節點用於存放name 的數組中。

此時,剛開辟的新節點成了尾節點,尾節點不指向任何其它節點,因此s->link=NULL;(NULL是空指針)
(C中處理指針需要小心行事)

p=s; 將p變數賦值為s,即讓其為尾節點的地址,便於繼續添加節點。

『捌』 c語言用單鏈表基本操作實現

補充銷毀鏈表、列印鏈表內容的兩個函數。主函數已補上建立、插入、刪除、列印諸代碼。

#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>

typedefintElemType;

typedefstructNode{
ElemTypedata;
structNode*next;
}LNode,*LinkList;

voidinilialist(LNode**L){
if((*L=(LNode*)malloc(sizeof(LNode)))==NULL)
exit(1);
(*L)->next=NULL;
}

/*銷毀*/
/*初始條件:單鏈表L已存在。操作結果:銷毀單鏈表L*/
voiddestroyList(LinkListL){
LinkListp,q;

p=L->next;/*p指向第一個結點*/
while(p){/*沒到表尾*/
q=p->next;
free(p);
p=q;
}
free(L);
}

voidinsert(LNode*L,inti,ElemTypex){
LNode*s,*p=L;
intj=0;
while(j!=(i-1)&&p!=NULL){
p=p->next;
j++;
}

if(p==NULL){
printf("序號出錯!");
}
else{
if((s=(LNode*)malloc(sizeof(LNode)))==NULL)
exit(1);
s->data=x;
s->next=p->next;
p->next=s;
}
}


voidDelete(LNode*L,inti){//刪除值為x的結點
LNode*p;
LNode*u;
intj=0;
p=L;
while(j!=i-1&&p!=NULL){
p=p->next;
j++;
}
if(p==NULL||p->next==NULL){
printf("刪除序號出錯!");
}
else{
u=p->next;
p->next=u->next;
free(u);
}
}

/*列印鏈表內容*/
/*初始條件:單鏈表L已存在。操作結果:當鏈表不為空時,列印鏈表內容並返回OK,否則返回ERROR*/
intprintList(LinkListL){
LinkListp=L->next;/*p指向第一個結點*/

while(p){
printf("%d ",p->data);
p=p->next;
}
putchar(' ');
return1;
}

intmain(void){
LinkListL;
inti;

/*初始化單鏈表*/
inilialist(&L);

/*插入10個元素*/
printf("建立10個數據元素的線性表: ");
for(i=1;i<=10;i++)
insert(L,i,i);
printList(L);
putchar(' ');

puts("第2位置插入元素25:");
insert(L,2,25);
printList(L);
putchar(' ');

puts("刪除第4個位置上的元素:");
Delete(L,4);
printList(L);
putchar(' ');

destroyList(L);

getch();/*屏幕暫留*/
return0;
}

『玖』 C語言頭插法建立單鏈表

1. 所謂頭指針即為指向鏈表第一個節點的指針(若鏈表含有頭結點,則指向頭結點),該指針變數的值即為鏈表第一個節點(或頭節點)的地址 ,故對於你這段代碼來說頭指針L存放的是鏈表第一個元素的地址(因為沒有頭節點),若要將s所指向的元素要插入到表頭,步驟如下:(1)新元素與鏈表建立連接,(2)斷開頭指針與鏈表的連接,(3)頭指針指向新的表頭(本程序中即s所指的元素).
用代碼實現即為:(1)s->next=L(L原先指向第一個元素,現在讓新元素與鏈表建立連接,新元素成為表頭元素,原來的表頭元素成為鏈表上的第二個元素,需要將s的鏈接指針指向原先的表頭元素,即把L中原先存儲的表頭元素的地址賦給s的next指針),(2)(3)L=s(第一步完成了新元素加入鏈表的操作,若要想新元素作為鏈表的第一個元素,就要把它的地址賦給頭指針L,因為L作為頭指針應該始終指向表頭元素.這個語句就是實現第二和第三步的:斷開頭指針與鏈表的連接,頭指針指向新的表頭)
2. 如果你對上面的解釋能接受的話,那麼這一問你應該可以解答了:分析過程就不寫了,由頭至尾為:5->4->3->2->1
3. 至於這一問,要放到具體的上下文環境中來解釋,但無非就是鏈表的插入,刪除操作.可以找相關的資料看一看

誠如一樓所言:這部分剛開始學習時最好畫個圖,就很容易明白了

你也可以去這看一看:
http://blog.csdn.net/bingwen0210/archive/2007/04/07/1556089.aspx
上面有圖.