『壹』 用c語言編寫一個刪除單鏈表中重復的結點的程序,該怎麼寫
圖片早枝慶在哪裡???
#include
#include
struct
node
{
int
num;
struct
node
*next;
};//定義節點
int
main()
{
struct
node
*p,*temp,*head;
int
i,a=1;
temp=(struct
node
*)malloc(sizeof(struct
node));//開辟一個節點空間搭族
temp->num=a;
head=p=temp;//得到頭陸握結點
p->next=null;
for(i=0;i<9;i++)
{
a=a+2;
temp=(struct
node
*)malloc(sizeof(struct
node));
temp->num=a;
temp->next=null;
p->next=temp;
p=p->next;
}
p=head;
for(;p
!=
null;)//列印鏈表
{
printf("%d,"p->num);
p=p->next;
}
return
0;
}
『貳』 數據結構(C語言版)中的刪除鏈表中的一個節點
代碼如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
int a;
List* next;
}list;
void newList(list* l)//創建結點
{
list* a[4];
for (int i = 0; i < 4; i++)
{
a[i] = (list*)malloc(sizeof(list));
a[i]->a = i+1 ;
}
l->next = a[0];
a[0]->next = a[1];
a[1]->next = a[2];
a[2]->next = a[3];
a[3]->next = NULL;
}
void printfList(list* l)//列印結點的數據內容
{
printf("該鏈表的內容是: ");
while (l->next)
{
printf("%d ", l->next->a);
l = l->next;
}
printf(" ");
}
void setList(list* l,int x,int y)
{
list* head = l;
l = l->next;
while (l)
{
if (l->a >=y || l->a <=x)//將結點的數據區與指定區域進行比較
{
head->next = l;//將滿足條件的結點連接在新表的最後一個結點
//指針後移
l = l->next;
head = head->next;
}
else
{
//不滿足的結點進行刪除
list* l1 = l;
l = l->next;
free(l1);
}
}
head->next = NULL;
}
int main()
{
list* l = (list*)malloc(sizeof(List));
newList(l);//初始化鏈表
printfList(l);//輸出舊表內容
setList(l,1,3);//進行修改
printfList(l);//輸出修改後的鏈表
//system("pause");
return 0;
}
(2)c語言單鏈表刪除節點擴展閱讀
鏈表的特點
1、插入、刪除數據效率高,時間復雜度為O(1)級別(只需更改指針指向即可),隨機訪問效率低,時間復雜度O(n)級別(需要從鏈頭至鏈尾進行遍歷)。
2、和數組相比,內存空間消耗更大,因為每個存儲數據的節點都需要額外的空間存儲後繼指針。
常用的鏈表類型
1、單鏈表
1)每個節點只包含一個指針,即後繼指針。
2)單鏈表有兩個特殊的節點,即首節點和尾節點。用首節點地址表示整條鏈表,尾節點的後繼指針指向空地址null。
3)性能特點:插入和刪除節點的時間復雜度為O(1),查找的時間復雜度為O(n)。
2、循環鏈表
1)除了尾節點的後繼指針指向首節點的地址外均與單鏈表一致。
2)適用於存儲有循環特點的數據,比如約瑟夫問題。
3、雙向鏈表
1)節點除了存儲數據外,還有兩個指針分別指向前一個節點地址(前驅指針prev)和下一個節點地址(後繼指針next)。
2)首節點的前驅指針prev和尾節點的後繼指針均指向空地址。
『叄』 建立帶頭節點的單鏈表,在單鏈表的第i節點之前插入一個新節點,刪除第i個節點,用c語言寫、拜託了
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
typedefstructLinkNode
{
intdata;
struct檔岩漏LinkNode*pNext;
}LinkNode,*PNode;
//insertwithpositon
boolinsert(LinkNode*pHead,intdata,intiPos)
{
LinkNode*p=NULL,*pTmp=NULL;
LinkNode*pNewNode=(LinkNode*)malloc(sizeof(LinkNode));
pNewNode->data=data;
pNewNode->pNext=NULL;
p=pHead;
while((iPos-1)&&p->pNext){
p=p->pNext;
iPos--;
}
if(p->pNext==NULL){
p->pNext=pNewNode;
pNewNode->pNext=NULL;
}else{
pTmp=p->pNext;
p->pNext=pNewNode;
pNewNode->pNext=pTmp;
}
returntrue;
}
//deletewithposition
booldeletefun(LinkNode*pHead,intiPos)
{
LinkNode*p=pHead,*pTemp=NULL;
if(p->pNext==NULL)
returntrue;
while((iPos-1)&&p->pNext->pNext)
{
p=p->pNext;
iPos--;
}
pTemp=p->pNext;
if(p->pNext->pNext!=NULL){
p->pNext=p->pNext->pNext;
free(pTemp);
}else{
free(p->pNext);
p->pNext=NULL;
}
returntrue;
}
voidPrintLink(constLinkNode*pHead)
{
LinkNode*p=pHead->pNext;
while(p)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("行爛 ");
}
intmain()
{
LinkNodeobHead;
obHead.pNext=NULL;
insert(&obHead,10,1);
insert(&obHead,100,1);
insert(&obHead,1000,1);
insert(&obHead,10000,1);
insert(&obHead,100000,1);
insert(&obHead,333,2);
PrintLink(&obHead);
deletefun(&obHead,2);
PrintLink(&棗鄭obHead);
return0;
}
『肆』 c語言結構體鏈表的節點刪除問題 求助大佬
這個出錯點在行 while() 循環之後的那一句: free(l->tail); 第一段程序,其實在 while() 循環裡面已經把全部節點都釋放了,包括尾節點,所以第一段程序不需要再釋放一次 l->tail,只需要保留 l->tail = NULL; 即可。 第二段程序,因為最後一個...
2019-10-14回答者:隱世高手0074個回答
c語言中刪除鏈表指定節點的一些問題?
問:struct student *Del (struct student *head, int num) { struct studen...
答:你仔細看看 while (p1->num != num && p1->next != NULL) 這一句之前的代碼 p2什麼時候賦值過? 而且if (p2 == head) //如果要刪除的節點是第一個節點 既然是第一個節點,那麼 while (p1->num != num && p1->next != NULL) 這個循環一次都沒有執...
2015-10-20回答者:知道網友1個回答2
C語言數據結構的鏈表刪除與查找問題~~,實在是被弄...
問:#include "stdlib.h" #include "stdio.h" typedef struct node{ //鏈表...
答:#include #include typedef struct LNode {char character; struct LNode*next; }LNode,*PLNode; PLNode CreateList()/*創建單鏈表*/ {PLNode P,head,q; int i; head=(PLNode)malloc(sizeof(LNode)); p=head; p->next=NULL; for(i=0;icharacter=...
2010-11-25回答者:qjbrh532個回答
C語言刪除鏈表結點 結點結構如下
問:#define ELEMTYPE char typdef struct node { ELEMTYPE date; struct no...
答:我提供思路哈,你自己寫一下,這個不難的。 分為兩種情況: 1、刪除的是頭結點,這又可以分為兩種情況:a)若是鏈表只有一個頭結點,那麼刪除後頭結點為NULL;b)若是鏈表不止一個節點,那麼head指針指向頭結點下一個節點。兩種情況都要free 之...
『伍』 c語言中刪除鏈表中的一個節點
temp=p;
p=p->next;
temp->next=NULL;
這三句存在問題,temp=p,讓temp指向p所指向的節點,p=p->next,p指向後移
temp->next=NULL,讓temp的後繼為空,這里出了問題,鏈表從temp指向的節點斷開,相當於刪除p之後的所有節點。
應該先判斷p是不是最後節點
if(p->next==NULL)
如果是,只好去找p的前趨pre,讓pre->next=NULL,free(p)
如果不是最後節點,將p的後繼節點數值域復制給p,然後將p的後繼節點刪除,等同與刪除p
p->data=p->next->data;
p->next=p->next->next;
free(p);
『陸』 用C語言編寫一個使用遞歸演算法實現刪除單鏈表中值為X的第一個節點與所有節點
#include<stdio.h>吵亂
#include<stdlib.h>
typedef struct node
{
char data;
struct node* next;
}Lnode;
Lnode *head=NULL;
Lnode *tail=NULL;
void create()
{
head = (Lnode*)malloc(sizeof(Lnode));
tail = head;
if(head!=NULL)
{
printf("please input data: ");
scanf(" %c",&head->裂碰余data);
head->next=NULL;
}
}
void delFirst(Lnode *pre ,Lnode *ptr,char x) //遞歸刪除肆滾第一個 = x
{
if(ptr==NULL)
return;
if(pre==NULL && ptr->data == x)
{
head=ptr->next;
ptr->next = NULL;
free(ptr);
ptr=NULL;
return;
}
if(pre!=NULL && ptr->data == x)
{
pre->next = ptr->next;
ptr->next = NULL;
free(ptr);
ptr = NULL;
return;
}
pre = ptr;
ptr = ptr->next;
delFirst(pre,ptr,x);
}
void delAll() //遞歸刪除所有
{
Lnode * tmp=NULL;
if(head==NULL)
return;
if(head->next!=NULL)
{
tmp = head->next;
free(head);
head=tmp;
delAll();
}
else
{
free(head);
head=NULL;
}
}
void insert()
{
if(tail == NULL)
return;
tail->next = (Lnode*)malloc(sizeof(Lnode));
if(tail->next != NULL)
{
printf("please input data: ");
scanf(" %c",&(tail->next->data));
tail=tail->next;
tail->next=NULL;
}
}
void print()
{
Lnode* tmp =head;
if(head==NULL)
printf("no data\n");
while(tmp!=NULL)
{
printf("%c ",tmp->data);
tmp=tmp->next;
}
}
void lfree() //非遞歸刪除
{
Lnode* tmp=NULL;
while(head!=NULL)
{
tmp=head;
head=head->next;
free(tmp);
}
}
void main()
{
int i=0;
create();
for(i=0; i<5; i++)
{
insert();
}
delFirst(NULL,head,'1');
print(head);
delAll();
print(head);
}
『柒』 數據結構代碼(用C語言) 單鏈表的插入和刪除
單鏈表功能大全,嘿嘿
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int nDate;
struct node *pstnext;
}Node;
//鏈表輸出
void output(Node *head)
{
Node *p = head->pstnext;
while(NULL != p)
{
printf("%d ", p->nDate);
p = p->pstnext;
}
printf("\r\n");
}
//鏈表建立
Node* creat()
{
Node *head = NULL, *p = NULL, *s = NULL;
int Date = 0, cycle = 1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
printf("分配內存失敗\r\n");
return NULL;
}
head->好敏和pstnext = NULL;
p = head;
while(cycle)
{
printf("請輸入數據且當輸入數據為0時結束輸入\r\n");
scanf("%d", &Date);
if(0 != Date)
{
s = (Node*)malloc(sizeof(Node));
if(NULL == s)
{
printf("分配內存失敗\r\友盯n");
return NULL;
}
s->nDate = Date;
p->pstnext = s;
p = s;
}
else
{
cycle = 0;
}
}
p->pstnext = NULL;
return(head);
}
//單鏈表測長
void length(Node *head)
{
Node *p = head->pstnext;
int j=0;
while(NULL != p)
{
p = p->pstnext;
j++;
}
printf("%d\r\n", j);
}
//鏈表按值查找
void research_Date(Node *head, int date)
{
Node *p;
int n=1;
p = head->pstnext;
while(NULL != p && date != p->nDate)
{
p = p->pstnext;
++n;
}
if(NULL == p)
{
printf("鏈表中沒有找到該值");
}else if(date == p->nDate)
{
printf("要查找的值%d在鏈表中第%d個位置\r\n", date, n);
}
return;
}
//按序號查找
void research_Number(Node *head, int Num)
{
Node *p=head;
int i = 0;
while(NULL != p && i < Num)
{
p = p->pstnext;
i++;
}
if(p == NULL)
{
printf("查找位置不合法\r\n");
}else if(i == 0)
{
printf("查找位置為頭結點\r\n");
}else if(i == Num)
{
printf("第%d個位置數據為%d\r\n", i, p->nDate);
}
}
//在指定元素之前插入新結點
void insert_1(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre && j < i-1)
{
pre = pre->pstnext;
j++;
}
if(NULL == pre || j > i-1)
{
printf("插拿鬧入位置不存在\r\n");
}else
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配內存失敗\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}
}
//在指定元素之後插入新結點
void insert_2(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre->pstnext && j < i)
{
pre = pre->pstnext;
j++;
}
if(j == i)
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配內存失敗\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}else
{
printf("插入位置不存在\r\n");
}
}
//刪除指定結點
void Delete_1(Node *head, int i3)
{
Node *p = head, *pre = NULL;
int j = 0;
while(NULL != p && j < i3)
{
pre = p;
p = p->pstnext;
j++;
}
if(NULL == p)
{
printf("刪除位置不存在\r\n");
}else
{
pre->pstnext = p->pstnext;
free(p);
}
}
//指定刪除單鏈表中某個數據,並統計刪除此數據的個數
int Delete_2(Node *head, int Delete_date)
{
int count = 0;
Node *p = head, *q;
while(NULL != p->pstnext)
{
q = p->pstnext;
if(q->nDate == Delete_date)
{
p->pstnext = q->pstnext;
free(q);
++count;
}
else
{
p = q;
}
}
return count;
}
//鏈表逆置
void Reverse_list(Node *head)
{
Node *q, *s;
if(NULL == head->pstnext || NULL == head->pstnext->pstnext)
{
return;
}
q = head->pstnext->pstnext;
head->pstnext->pstnext = NULL;
while(NULL != q)
{
s = q->pstnext;
q->pstnext = head->pstnext;
head->pstnext = q;
q = s;
}
}
//單鏈表的連接
void connect_list(Node *head, Node *head_New)
{
Node *p = head;
while(NULL != p->pstnext)
{
p = p->pstnext;
}
p->pstnext = head_New->pstnext;
}
//單鏈表銷毀
void destroy_list(Node* head)
{
while (NULL != head)
{
Node* temp = head;
head = head->pstnext;
free(temp);
}
}
void main()
{
int date, num; //待查找數據
int i3; //指定刪除元素的位置
int i1, i2, Newdate_1, Newdate_2; //待插入的新數據
int Delete_date, k; //待刪除的數據與其個數
Node *Head = NULL; //定義頭結點
Node *Head_New = NULL;
//鏈表建立
Head = creat();
printf("輸出建立的單鏈表\r\n");
output(Head);
//單鏈表測長
printf("單鏈表長度為\r\n");
length(Head);
//鏈表按值查找
printf("請輸入待查找的數據\r\n");
scanf("%d", &date);
research_Date(Head, date);
//鏈表按序號查找
printf("請輸入待查找序號\r\n");
scanf("%d", &num);
research_Number(Head, num);
//在指定第i1個元素之前插入新元素Newdate
printf("在指定第i個元素之前插入新元素Newdate");
printf("請輸入i與元素且以逗號間隔\r\n");
scanf("%d,%d", &i1, &Newdate_1);
insert_1(Head, i1, Newdate_1);
printf("插入後新鏈表\r\n");
output(Head);
//在指定第i2個元素之後插入新元素Newdate
printf("在指定第i個元素之後插入新元素Newdate");
printf("請輸入i與元素且以逗號間隔\r\n");
scanf("%d,%d", &i2, &Newdate_2);
insert_2(Head, i2, Newdate_2);
printf("插入後新鏈表\r\n");
output(Head);
//指定刪除i3元素
printf("刪除元素的位置\r\n");
scanf("%d", &i3);
Delete_1(Head, i3);
printf("刪除後新鏈表\r\n");
output(Head);
//指定刪除單鏈表中某個數據,並統計刪除此數據的個數
printf("請輸入待刪除的元素\r\n");
scanf("%d", &Delete_date);
k = Delete_2(Head, Delete_date);
printf("刪除後新鏈表\r\n");
output(Head);
printf("刪除指定元素在鏈表中的個數為:");
printf("%d\r\n", k);
//單鏈表逆置
Reverse_list(Head);
printf("逆置後輸出\r\n");
output(Head);
//單鏈表的連接
printf("建立一個新鏈表\r\n");
Head_New = creat();
printf("輸出新鏈表");
output(Head);
printf("將新鏈表連接到原來鏈表的尾部並輸出\r\n");
connect_list(Head, Head_New);
output(Head);
destroy_list(Head);
return;
}
『捌』 用C語言編寫程序:清空一個帶頭結點的鏈表 .
typedef int status;
typedef int Elemtype;
const int ok=1;
const int error=0;
const int overflow=-2;
const int TRUE=1;
const int FALSE=0;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist; //定義單鏈表的結點類型;
status initlist(Linklist &L) //初始化單鏈表;
{
L=(Linklist) malloc(sizeof(LNode));
if(!L) exit(overflow);
L->next=NULL;
//TODO1 生成單鏈表的頭結點;
return ok;
}
status destroylist(Linklist &L) //銷毀單鏈表;
{ while(L)
{ Linklist p=L->next;
free(L);
L=p;
}
//TODO2
return ok;
}
status listempty(Linklist &L) //判斷單鏈表是否為空;
{ if(L->next==NULL)
return TRUE;
else return FALSE;
//TODO3
return TRUE;
}
int listlength(Linklist L) //求單鏈表的長度;
{ Linklist p=L->next;
int i=0;
while(p)
return i;
//TODO4
//p先指向第一個結點;
//計數器清0;
//當p所指向的結點存在,計數器加1,同時指針下移;
//while語句結束時,p移出單鏈表;
//返回單鏈表的長度;
}
void clearlist(Linklist &L) //清空單鏈表;
{while (L->next) {
Linklist p=L->next; L->next=p->next;
}
//TODO5
}
void printlist(Linklist L) //輸出單鏈表裡的每一個結點;
{
Linklist
p=L->next;
while(p)
{printf("%d",p->data);
p=p->next;
}
//TODO6
//p指向頭結點;
//當p指向的結點存在,輸出該結點,同時指針下移;
}
status getelem(Linklist L,int i,Elemtype &e)//取表中第i個元素放到變數e里;
{ Linklist p=L->next; int j=1;
while(p&&j<i)
e=p->data;
if(!p||j>i) return error;
//TODO7
//p首先指向第一個元素
//while語句結束時,如果第i個結點存在,p指向它;
//否則p指向表尾;
//表中不存迅鎮在第i個結點或者表為空,返回出錯信息;
}
status listinsert(Linklist &L,int i,Elemtype e)//向表中第i個元素的前面插入元素e;
{ Linklist p = L; int j = 0;
while (p && j < i-1)
// 尋找第 (i-1) 個結點
if (!p || j > i-1)
return error;
else
//TODO8
//p首先指向頭結點;
//如果第i個結點存在,while語句激首結束時,p指向第i-1個結點;
//否則p指向表尾;
//生成新的結點;
//新的結點插入到p指向結點的後面(也就是插入到第i個結點的前面明昌數);
return ok;
}
status listdelete(Linklist &L,int i,Elemtype &e)//刪除表L中第i個元素,結果用e返回. 操作成功返回ok,失敗時返回error
{Linklist p = L; int j = 0;
while (p->next && j < i-1)
// 尋找第 i-1 個結點,並令 p 指向它。
if (p->next&& j == i-1)
{Linklist q = p->next; p->next = q->next; // 刪除並釋放結點
e = q->data; free(q);}
return ok;
//TODO9
}
『玖』 C語言 單鏈表刪除問題,為什麼無法刪除頭節點
//LIST *delist(LIST *head,int num)
LIST *delist(LIST **head,int num) //<<<<******** 注意參數形橘脊式
{LIST *p1,*p2;
if( NULL==*head ) //if( NULL==head ) //<<<*head
{printf("it is a null list !");
return(NULL);
}
//for( p1=head;p1->date!=num&&p1->next!=NULL;p1=p1->next )
for( p1=*head;p1->date!=num&&p1->next!=NULL;p1=p1->next ) // *head
p2=p1;
if( num==p1->date )
{
if( p1==*head ) //if( p1==head )//圓尺滲*head
{*head=p1->next;} //{head=p1->next;}//<<<<<***** *head!!!!!
else
{p2->next=p1->next;}
}
else
{printf("NOT FOUND DATE");}
return(*head );//*head
}
//// 調用時要把首結點指針的地址傳進去 調用困蠢方法: delist(&head, 5);
『拾』 C語言單鏈表刪除表中的大於min小於max的所有節點,我寫了一個,但是一直運行不成功……
voidDelete(LNode*head,intmin,intmax)//刪除大於Min小於Max的元素
{
LNode*p,*q;
p=head;
while(p->next!=NULL)
{
if(p->next->data<max&&p->next->data>min)
{
差明派q=p->next;
p->next=q->next;//刪除指定的字虛賀符
free(q);
}
p=p->next;//不刪除,只是槐州指針後移
}
}