① 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;
 }
}
