① C語言單向鏈表的創建,輸入,插入和刪除的實現
/* 線性表-鏈表的操作: 只提供核心語句 */
#include "stdio.h"
#include "stdlib.h"
#define N 100
typedef int ElemType;/* 鏈表的存儲結構 */
typedef struct LNode{
ElemType data;
struct LNode *next; } LNode,*LinkList;/* 鏈表的基本操作 *//******* 1.初始化鏈表 ******/
void InitList(LinkList *L)
{ *L=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL; }/******* 2.銷毀鏈表 ******/
void DestroyList(LinkList *L)
{ LinkList p;
while(*L!=NULL)
{ p=*L;
*L=(*L)->next;
free(p); }
}
/******* 10.在順序表第n個位置頃亮兆插入元素e ******/
void ListInsert(LinkList *L, int n, ElemType e)
{ LinkList p,q,new; int i;
q=*L; p=(*L)->next; i=1;
while (p!=NULL && i<n) { q=p; p=p->next; i++; }
new=(LinkList)malloc(sizeof(LNode));
new->data=e;
q->next=new; new->next=p; }/******* 11.刪除鏈表中第n個位置的元素 ******/
void ListDelete(LinkList *L, int n, ElemType *e)
{ LinkList p,q; int i;
q=*L; p=(*L)->next; i=1;
while (p!=NULL && i<n) { q=p; p=p->next; i++; }
*e=p->data;
q->next=p->next; free(p); }/******* 12.遍歷鏈表並輸出 ******/
void ListTraverse(LinkList L)
{ LinkList p;
printf("\nList:\t");
p=L->next;
while (p!=NULL)
{ printf("%d\t",p->data);
p=p->next; }
}/******* A(2).後接法建立順序鏈表雀租 ******/
void CreateList2(LinkList *L, ElemType a[], int n)
{ LinkList p,new; int i;
p=*L;
for(i=0; i<n; i++)
{ new=(LinkList)malloc(sizeof(LNode));
new->data=a[i];
p->next=new; p=p->next; }
p->next=NULL;
}
/* 主函數 */
main()
{ LinkList La; ElemType a[]={1,3,5,7,9},x;
InitList(&La);//初始化鏈表
CreateList2(&La,a,5);//建立鏈表並用鍵寬數組賦值
ListTraverse(La);//遍歷鏈表
ListInsert(&La, 3, 100);//第三個位置插入100
ListTraverse(La);//遍歷鏈表
ListDelete(&La,5,&x);//刪除第五個元素,用x返回
ListTraverse(La);//遍歷鏈表 DestroyList(&La);//銷毀鏈表
} 這是我們剛學的,保證簡潔准確
② 建立單向動態鏈表,並對它進行插入、刪除和輸入等操作,包括以下任務:
#include<stdio.h>
#define LEN sizeof(struct number)
struct number /*定義編號和數字*/
int name;
int num;
struct number * next;
};
struct number * create() /*建立鏈表函數*/
{
struct number * head,* new,* tail,* p;
int count=0;
while(1)
{
new=(struct number *)malloc(LEN);
printf("input Name and Number\n");
scanf("%d %d",&new->name,new->num); /*用尺核戶輸入編號和數字*/
if(new->name==0)
{
free(new);
break;
}
else if(count==0)
{
head=new;
tail=new;
}
else
{
tail->寬困氏next=new;
tail=new;
}
count++;
}
tail->next=NULL;
return(head);
}
struct number * delist(struct number *head,int name) /*刪除數字的函數*/
{
struct number * p0,* p1;
p1=head;
if(head==NULL)
{
printf("\nempty list!\n");
}
else
if(p1->name==name) /*找到相同編慎散號*/
head=p1->next;
else
{
while(p1->name!=name&&p1->next!=NULL) /*逐一排查*/
{
p0=p1;
p1=p1->next;
}
if(p1->name==name)
{
p0->next=p1->next;
printf("The node is deleted\n");
}
else
printf("The node can not been foud!\n");
}
return head;
}
struct number * insert(struct number * head,struct number * new)
{ /*插入函數*/
struct number * p0,* p1;
p1= head;
if(head==NULL)
{
head=new;
new->next=NULL;
}
else
if(new->name<p1->name) /*尋找新數字適合的位置插入*/
{
new->next=head;
head=new;
}
else
{
while(new->name>p1->name)
{
p0=p1;
p1=p1->next;
}
new->next=p0->next;
p0->next=new;
}
return(head);
}
void print(struct number * head) /*列印函數*/
{
struct number * p;
p=head;
if(head==NULL) /*其實用不到*/
printf("list is empty\n");
else
while(p!=NULL)
{
printf("%d%d\n",p->name,p->num); /*列印鏈表內容*/
p=p->next;
}
}
struct number * find(struct number * head,struct number * new)
{ /*查詢函數*/
struct number * p0,* p1;
p1= head;
if(head==NULL)
{
head=new;
new->next=NULL;
}
else
if(new->name!=p1->name) /*尋找和輸入編號相同的節點,不是則往下讀*/
{
new->next=head;
head=new;
}
else
{
while(new->name==p1->name)
{
printf(」find successfully!\n」);
printf(「%d %d」,p1->name,p1->num);
}
}
return(head);
}
void main() /*主函數*/
{
struct number * head,* p;
int name;
head=create(); /*往下逐一調用函數*/
print(head);
printf("Input the delete number:");
scanf("%d",&name);
head=delist(head,name);
print(head);
printf("Input the inserted name and number:");
p=(struct number *)malloc(LEN);
scanf("&d&d",p->name,p->num);
head=insert(head,p);
print(head);
printf(「Input the found name:」);
scanf(「%d」,&name);
head=find(head,p);
print(head);
}
find函數你可以不用,在主函數中將find函數也一起刪掉就行了。
③ 如何降解雙鏈DNA中的單鏈DNA
單鏈的核酸外切酶包括大腸桿菌核酸外切酶Ⅰ(exoⅠ)和核酸外切酶Ⅶ(exoⅦ)。核酸外切酶Ⅶ(exoⅦ)能枝跡夠從5′-末端或3′-末端呈單鏈狀態的DNA分子上降解DNA,產生出寡核苷酸短片段,而且是唯一不需要Mg2+離子的活性酶,是一種耐受性很強的核酸酶。核酸外切酶Ⅶ(exoⅦ)可以用來測定基因組DNA中一些特殊的間隔序列和編碼序列的位置。它只切割末端有單鏈突出的DNA分子。 雙鏈的核酸外切酶包括大腸桿菌核酸外切酶Ⅲ(exoⅢ)、λ噬菌體核酸外切酶(λexo)以及T7噬菌體基因6核酸外切酶等。大腸桿菌核酸外切酶Ⅲ(exo Ⅲ)具有猛爛並多種催化功能,可歷首以降解雙鏈DNA分子中的許多類型的磷酸二酯鍵。其中主要的催化活性是催化雙鏈DNA按3′→5′的方向從3′-OH末端釋放5′-單核苷酸。大腸桿菌核酸外切酶Ⅲ(exoⅢ)通過其3′→5′外切酶活性使雙鏈DNA分子產生出單鏈區,經過這種修飾的DNA再配合使用Klenow酶,同時加進帶放射性同位素的核苷酸,便可以制備特異性的放射性探針。
④ C語言,單向鏈表 不知道前驅指針,如何刪除某一節點。 情況考慮詳盡一些!
偽代碼:
if node.age ==30
delete(node)
delete是封裝好了的代碼
刪除一個節點的步驟:
如我有一個鏈表:A B C D 四個元素
我要刪除B,則有
p =A.next
A.next = p.next
free(p)
主要是思想對就行,一定要封裝
你這個屬於那種在線刪除
就是先查找,如果符合條件,就刪除。信野
刪除操作,必須知道有刪除的節點的前一個節點的地址才行。
那麼你應散中該每次查找的時候不是判斷當前節點是否符合要求,而是判斷下一個節點。如果符合就按照刪除節點的刪除來。
刪除操作的沖坦山三部曲:
第一步:保存刪除節點的地址
第二步:將刪除節點的前一個節點的指針域指向刪除節點的下一個
第三部:free 需要刪除節點
我現在直接在這里寫代碼了
void del(head,age)
{
p = head;
while(p)
{
if( p->next && p->next->age == age )//刪除操作的三步曲
{
q=p->next;
p->next = q ->next;
free(q);
}//end if
p = p->next;
}//end while
}
代碼就是這樣的。很簡單。這段代碼並不能編譯,你加上類型就好了。我強調的是方法。
⑤ 網站莫名的出現很多單鏈,在我自己的網站也沒有找到,使用站長工具查到了,請問怎麼消除這些鏈接啊
可能是被掛黑鏈了,你需要修改源程序裡面的頁面代碼,找到這些鏈接直接刪除就行了
⑥ c++ 中單向鏈表的頭結點 刪除
1 .要麼用引用指針、要麼用指向指針的指針, 因為這樣才能改變 實參為指針的變數,如分配內存等操作
2.可以刪除前端的頭指針head ,但你要用另一個指針指向刪除haed後的頭指針,這樣理解上不容易,所以上面這樣做比較好,就是讓head一直指向頭
3,在堆內申請的內存如果不delete ,那麼在程序運行完畢前,它就會一直佔用這塊內存,如果在堆內申請的變數多的話,會佔用很多內存,所以對於 不用的堆變數,要極時刪除
⑦ 編寫不帶頭結點單鏈表的插入操作和刪除操作演算法
Status ListInsert(LinkList &L,int i,ElemType e)
{ // 在不設頭結點的單鏈線性表L中第i個位置稿轎核之前插入元素e
int j=1; // 計數器初值為1
LinkList s,p=L; // p指向第1個結點
if(i<1) // i值不合法
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新結點,以下將其插入L中
s->data=e; // 給s的data域賦值e
if(i==1) // 插在表頭
{ s->next=L; // 新結點指向原第1個結點
L=s; // L指向新結點(改變帆畝L)
}
else
{ // 插在表的其餘處
while(p&&j<i-1) // 尋找第i-1個結點
{ j++; // 計數器+1
p=p->next; // p指向下一個結點
}
if(!p) // i大於表長+1
return ERROR; // 插入失敗
s->next=p->next; // 新結點指向原第i個結點
p->next=s; // 原第i-1個結點指向新結點
}
return OK; // 插入成功
}
Status ListDelete(LinkList &L,int i,ElemType &e)
{ // 在不設頭結點的單鏈線性表L中,刪除第i個元素,並由e返回其值
int j=1; // 計數器初值為1
LinkList q,p=L; // p指向第1個結點
if(!L) // 表L空
return ERROR; // 刪除失敗
else if(i==1) // 刪除第1個結點
{ L=p->next; // L由第2個結點開始(改變L)
e=p->data; // 將待刪結點的值賦給e
free(p); // 刪除並釋放第1個結點
}
else
{ while(p->next&&j<i-1) // 尋找第i個結點,並令p指向其前驅
{ j++; // 計數器+1
p=p->next; // p指向下一個結點鍵掘
}
if(!p->next||j>i-1) // 刪除位置不合理
return ERROR; // 刪除失敗
q=p->next; // q指向待刪除結點
p->next=q->next; // 待刪結點的前驅指向待刪結點的後繼
e=q->data; // 將待刪結點的值賦給e
free(q); // 釋放待刪結點
}
return OK; // 刪除成功
}
⑧ 求C語言大神幫忙,一道數據結構題,刪除單鏈表中最大和次最大的數,感激不盡
#include<stdio.h>
#defineelemTypeint
#definestatusint
#defineOVERFLOW-1
#defineERROR0
#defineOK1
/*單鏈表數據結構*/
typedefstructlNode{
elemTypedata;
structlNode*next;
}lNode,*linkList;
/********************************以下為函數聲明********************************/
voidinitList(linkList*L); /*初始化*/
statuslistIsEmpty(linkListL); /*判斷單鏈表是否為空*/
statuslistInsertNode(linkListL,inti,elemTypee); /*單鏈表指定位置插入新元素*/
statuslistDeleteNode(linkListL,inti,elemType*e); /*刪除單鏈表指定位置元素*/
statuslistOutput(linkListL); /*輸出鏈笑告表*/
/********************************以上為函數聲明********************************/
/*初始化*/
/*操作結果:構造一個空的單鏈表L*/
voidinitList(linkList*L){
*L=(linkList)malloc(sizeof(structlNode));/*產生頭節點,並使L指向此頭節點*/
if(!*L)/*內存分配失敗*/
exit(OVERFLOW);
(*L)->next=NULL;/*指針域為空*/
}
/*判斷單鏈表是否為空*/
/*初始條件:單鏈表L已存在。操作結果:若L為空表,則返回TRUE,否則返回FALSE*/
statuslistIsEmpty(linkListL){
returnL->next==NULL;
}
/*單鏈表指定位置插入新元素*/
/*操作結果:在帶頭結點的單鏈表L中第i個位置之前插入元素e*/
statuslistInsertNode(linkListL,inti,elemTypee){
intj=0;
linkListp=L,s;
while(p&&j<i-1){/*尋找第i-1個結點*/
p=p->next;
j++;
}
if(!p||j>i-1)/*插入位置不合理:i小於1或者大於表長*/
returnERROR;
/*生成新結點,並插入L中*/
s=(linkList)malloc(sizeof(structlNode));
s->data=e;
s->next=p->next;
p->next=s;
returnOK;
}
/*刪除單鏈表指定位置元素*/
/*操作結稿笑果:在帶頭結點的單鏈線性表L中,刪除第i個元素,並由e返回其值*/
statuslistDeleteNode(linkListL,inti,elemType*e){
intj=0;
linkListp=L,q;
while(p->next&&j<i-1){/*尋找第i個結點,並令p指鍵升含向其前驅結點*/
p=p->next;
j++;
}
if(!p->next||j>i-1)/*刪除位置不合理:i小於1或者大於表長*/
returnERROR;
/*刪除並釋放結點*/
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
returnOK;
}
/*輸出鏈表*/
statuslistOutput(linkListL){
linkListp=L->next;/*p指向第一個結點*/
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
putchar(' ');
returnOK;
}
/*尋找鏈表中最大數*/
/*操作結果:L為帶頭結點的單鏈表的頭指針。最大值的位置賦值給maxIndex。*/
statusfindSpecificElem(linkListL,int*maxIndex){
inti=1;
elemTypemaxData;/*記錄最大數*/
linkListp=L->next;/*p指向第一個結點*/
maxData=p->data;
while(p){/*遍歷鏈表尋找最大數*/
if(p->data>maxData){
maxData=p->data;
*maxIndex=i;
}
p=p->next;/*p指向下一個結點*/
i++;
}
returnOK;
}
intmain(void){
linkListL;
intm1Index,m2Index;/*記錄最大、次大數的位置*/
elemTypem1Data,m2Data;/*記錄最大、次大數*/
/*構造一個鏈表,其中最大數為12,在第6位;次大數為9,在第3位。*/
initList(&L);
listInsertNode(L,1,7);
listInsertNode(L,2,5);
listInsertNode(L,3,9);
listInsertNode(L,4,2);
listInsertNode(L,5,4);
listInsertNode(L,6,12);
listInsertNode(L,7,6);
/*輸出鏈表*/
puts("鏈表原始內容為:");
listOutput(L);
putchar(' ');
/*先找到當前鏈表最大數,刪除該元素;再找一遍當前鏈表最大數,再刪除該元素。*/
/*如此實現刪除鏈表中最大數、次大數*/
findSpecificElem(L,&m1Index);
listDeleteNode(L,m1Index,&m1Data);
findSpecificElem(L,&m2Index);
listDeleteNode(L,m2Index,&m2Data);
printf("最大數:%d 次大數:%d ",m1Data,m2Data);
putchar(' ');
puts("刪除最大數、次大數後的鏈表內容為:");
listOutput(L);
getch();/*屏幕暫留*/
return0;
}
運行結果
⑨ 用一個演算法將單鏈中的值重復的節點刪除
void del(Linklist list)
{
Linklist p,q,r;
p=list->寬絕link;
r=list;
while(p!=NULL){
q=list;
while(q!=q)
if(q->data==p->data){
r->link=p->link;
free(p);
p=r->好喊link;
q=list;
}
else
q=q->link;
r=p;
p=p->友巧野link;
}
}